決定論的マルチプロセッシング(deterministicmultiprocessing)
专利摘要:
マルチプロセッシングシステムにおいて、マルチスレッドアプリケーションのスレッドによって実行される操作の順序を制御するためのハードウェアおよび/またはソフトウェアファシリティが提供される。ファシリティは、マルチスレッドアプリケーションに同じ入力が与えられると、マルチプロセッシングシステムが操作を決定論的にインターリーブし、それによってマルチスレッドアプリケーションが実行されるたびに同じ出力を生成するように、マルチスレッドアプリケーションの実行をシリアル化または選択的にシリアル化することができる。ファシリティは、マルチスレッドアプリケーションコードの実行を、決定論的数の操作を指定する2つ以上の量子に分割し、スレッドが2つ以上の量子を実行する決定論的順序を指定する。ファシリティは、トランザクショナルメモリシステムと共に動作することができる。ファシリティがトランザクショナルメモリシステムと共に動作するとき、各量子は、他のトランザクションと並行して実行され得るトランザクションに封入され、指定された決定論的順序に従ってコミットされる。 公开号:JP2011507112A 申请号:JP2010538213 申请日:2008-12-12 公开日:2011-03-03 发明作者:オスキン,マーク・エイチ;セゼ,ルイス・エイチ 申请人:ユニバーシティ・オブ・ワシントン; IPC主号:G06F9-45
专利说明:
[0001] 本願発明の実施例は、例えば、決定論的マルチプロセッシングに関する。] 背景技術 [0002] 本出願は、参照により本明細書に組み込まれる2007年12月12日出願の「DETERMINISTIC MULTIPROCESSING(決定論的マルチプロセッシング)」という名称の米国特許仮出願第61/013,019号の利益を主張する。] [0003] マルチプロセッシングは、2つ以上の処理装置がそれぞれ1つまたは複数のプロセス(プログラムまたは命令のセット)を同時に実行する動作モードである。マルチプロセッシングシステムの目的は、処理速度を向上させることである。通常、これは、各処理装置が同じプロセスの異なる命令のセットまたは異なるスレッドを処理することによって達成される。プロセスは、1つまたは複数のスレッドを実行することができる。各スレッドは、それ自体のプログラムコンテキストを含むそれ自体のプロセッサコンテキストを有する。従来、アプリケーションがマルチプロセッシングの利益を利用するためには、ソフトウェア開発者は、アプリケーションをマルチスレッド型で書く必要がある。本明細書で使用する場合、マルチスレッドアプリケーションとは、2つ以上のスレッドを同時に実行することができるプログラムを指す。] [0004] マルチプロセッサまたはマルチコアシステム(まとめて「マルチプロセッシングシステム」と呼ぶ)において、マルチスレッドアプリケーションの2つ以上のスレッドは同時に実行することができ、各プロセッサまたはコアが特定のスレッドを実行する。マルチスレッドアプリケーションのスレッドが、同時実行中に、例えばメモリなどリソースを共有することは、一般的である。本明細書で使用される場合、同時実行とは、マルチスレッドアプリケーションの2つ以上のスレッドの同時の実行を指す。同時実行の結果、マルチスレッドアプリケーションの2つ以上のスレッドが同じ共有リソースを読み取り、および/または更新することができる。例えば、あるスレッドは、共有メモリロケーションの値を変更することができ、一方、別のスレッドは、共有メモリロケーションに格納された値に応じて、一連の操作を実行する。] [0005] 従来のソフトウェア開発モデル下で、ソフトウェア開発者は、そのマルチスレッドアプリケーション内の並列スレッドを識別し、正しく同期しようと試みることにかなりの時間量を費やす。例えば、開発者は、ロック、セマフォ、バリア、または他の同期機構を明示的に使用して、共有リソースへのアクセスを制御することができる。スレッドが共有リソースにアクセスするとき、同期機構は、リソースが使用可能になるまで、これらのスレッドを一時停止することによって、他のスレッドがリソースにアクセスするのを防ぐ。同期機構を明示的に実装するソフトウェア開発者は、通常、同期コードをデバッグするのにもかなりの時間量を費やす。しかし、通常、同期エラーに起因するソフトウェアの欠陥(バグとも呼ばれる)が一時的に表面化する(すなわち、インターリーブされたスレッド操作の特定のシーケンスにのみバグが現れる可能性がある)。その結果、欠陥のあるソフトウェアは、小さな同期バグが現れる前に、何百回も正しく実行する可能性がある。] [0006] こうしたシステムにおけるスレッドの様々なインターリービングによって非決定論的挙動が作り出されるため、マルチプロセッシングシステムのためのソフトウェアを開発することは難しい。インターリービングとは、スレッド間の対話を含み得るスレッド操作の順序を指す。スレッド間の可能なインターリービングの数は、スレッドの数が増すにつれて、著しく増す。その結果、マルチスレッドアプリケーションは、誤り検出およびモデリングプログラムの挙動に関して、追加の問題を提示する。例えば、マルチスレッドアプリケーションに同じ入力が与えられると、マルチプロセッシングシステムは、スレッド操作を非決定論的にインターリーブし、それによって、マルチスレッドアプリケーションが実行されるたびに異なる出力を生成する。図1は、マルチプロセッシングシステムにおいて実行されるマルチスレッドアプリケーションにおける2つの可能なスレッドインターリービングの例を示す高レベル図である。図示されるように、アプリケーションは、少なくとも2つのスレッド、スレッド1およびスレッド2を含む。アプリケーションが呼び出されると、ある時点で、スレッド1は、変数Aの値を1に設定する(A=1)操作、次いで変数Bの値を変数Aの値に設定する(B=A)操作を実行し、スレッド2は、変数Bの値をゼロに設定する(B=0)操作、次いで変数Aの値を変数Bの値に設定する(A=B)操作を実行する。図示されるように、スレッド1およびスレッド2の操作は、非決定論的にインターリーブされ、それによって、アプリケーションが呼び出されるたびに、異なる出力を生成する。すなわち、最初に示された呼び出し中、操作のインターリービングによって変数AおよびBがそれぞれゼロに設定され、2番目に示された呼び出し中、操作のインターリービングによって変数AおよびBがそれぞれ1に設定された。] 図1 [0007] マルチスレッド実行における非決定性は、例えば、他のプロセスが同時に実行する、オペレーティングシステムリソースの割り当てにおける差、キャッシュの状態、トランスレーションルックアサイドバッファ(「TLB」)、バス、割り込み、および他のマクロアーキテクチャ構造など、実行環境におけるわずかな変化に起因し得る。] 発明が解決しようとする課題 [0008] その結果、マルチスレッドアプリケーションを開発することは、シングルスレッドアプリケーションを開発するよりかなり難しい。] 課題を解決するための手段 [0009] 従来、この問題に対処するにあたっての取り組みは、以前生成されたログファイルに基づいてマルチスレッド実行を決定論的に再生することに焦点を当てていた。しかし、決定論的再生システムは、再生ログファイルの維持に伴うオーバーヘッドの結果、かなりの性能の低下を受ける。さらに、決定論的再生では、ソフトウェア開発者は、スレッドのインターリービングがどのように実行されるかを制御しない。その結果、ソフトウェアが顧客に配布される前に、操作の特定のインターリービングに起因する同期バグは、識別(およびより重要には修正)されない場合がある。非決定性は、テストカバレージを評価するのを難しくする点で、ソフトウェア開発プロセスをさらに複雑にする。良好なカバレージは、広範なプログラム入力と、広範な可能なスレッドインターリービングとを必要とする。] [0010] ファシリティの1つまたは複数の実施形態が、添付の図面の図に例として、かつ限定されないものとして示されている。図中、参照番号は、類似の要素を示す。] 図面の簡単な説明 [0011] マルチスレッドプログラムにおける、2つの可能なスレッドインターリービングの一例を示す高レベル図である。 1つまたは複数の実施形態における、ファシリティによって実行される決定論的シリアル化プロセスのフロー図である。 1つまたは複数の実施形態における、ファシリティによって実行される決定論的選択的シリアル化プロセスのフロー図である。 1つまたは複数の実施形態における、ファシリティが実行するコンピューティングシステムのアーキテクチャ例を示す高レベルブロック図である。 1つまたは複数の実施形態における、決定論的マルチプロセッシングレイヤの様々な機能的要素を示す高レベルブロック図である。 1つまたは複数の実施形態における、マルチプロセッサコードを決定論的にするためにファシリティによって使用されるデータ構造を示す高レベルブロック図である。 1つまたは複数の実施形態における、スレッドを作成し、決定論的に実行する一例を示す高レベル図である。 1つまたは複数の実施形態における、マルチプロセッサコードを決定論的にするためにトランザクショナルメモリシステムを使用する一例を示す高レベルブロック図である。 1つまたは複数の実施形態における、アプリケーションを増補(augment)するためにファシリティによって実行されるプロセスを示すフロー図である。 1つまたは複数の実施形態における、ブロックを構文解析するためにファシリティによって実行されるプロセスを示すフロー図である。 1つまたは複数の実施形態における、マルチスレッドアプリケーションの増補された機能の制御フローグラフの一例である。 1つまたは複数の実施形態における、決定論的マルチプロセッシング初期化関数を示すフロー図である。 1つまたは複数の実施形態における、決定論的マルチプロセッシングコミット関数を示すフロー図である。] 実施例 [0012] 決定論的再生システムなどの従来のシステムは、マルチスレッドアプリケーションの開発における非決定論的挙動に伴う問題を適切に解決しない。さらに、既存のシステムは、マルチスレッドアプリケーションの配置における非決定論的挙動に伴う問題を低減することも、解決しようと試みることもない。したがって、マルチスレッドアプリケーションの決定論的マルチプロセッシングのためのハードウェアおよび/またはソフトウェアファシリティ(「ファシリティ」)が開発された。本明細書で使用される場合、決定論的マルチプロセッシングという用語は、マルチスレッドアプリケーションに同じ入力が与えられると、マルチスレッドアプリケーションによって同じ出力が生成される技術を指す。例えば、共有リソースへのスレッドアクセスを同期するための負担から開発者を解放することによって、ファシリティは、マルチスレッドアプリケーションを開発する処理を簡略化する。さらにファシリティは、こうしたマルチスレッドアプリケーションが配置されるとき、例えば、開発者がバグを再生し、様々なスレッドインターリービングを厳格にテストできるようにすることによって、マルチスレッドアプリケーションの信頼性を向上させる。] [0013] いくつかの実施形態において、ファシリティは、マルチスレッドアプリケーションの実行を決定論的な有限数の操作の組(各組は、本明細書では「量子」と呼ばれる)に分割する。量子を識別するとき、ファシリティは、例えば、通信無しのスレッド操作など、並行して実行され得る操作と、スレッド間通信、システムコールなど、決定論的な順序で実行されるべき操作とを区別することができる。次いで、ファシリティによって識別される各量子は、決定論的順序で実行される。マルチスレッドアプリケーションのスレッドによって量子が実行される順序を制御することによって、ファシリティは、マルチスレッドアプリケーションが決定論的に挙動できるようにする。すなわち、同じ入力が与えられると、マルチスレッドアプリケーションのスレッドは、その操作を決定論的にインターリーブし、それによって同じ出力を提供する。] [0014] いくつかの実施形態において、ファシリティは、マルチスレッドアプリケーションの実行をシリアル化する。すなわち、ファシリティは、すべてのスレッド操作のグローバルなインターリービングを制御することができる。例えば、これは、スレッド間に決定論的順序で渡されるメモリアクセストークンを確立することによって達成され得る。スレッドは、トークンの値がそのスレッドの識別子に一致するとき、トークンを「保持する」と呼ばれ得る。トークンの値がスレッドの識別子に一致しないとき、トークンの値がスレッドの識別子に一致するまで、その実行は一時停止される。トークンの値がスレッドの識別子に一致するとき、スレッドは、トークンが次のスレッドに渡される前に、決定論的な有限数の操作(すなわち量子)を実行する。例えば、決定論的順序で次のスレッドの識別子に対応するように、トークンの値を進めることによって、トークンは、次のスレッドに渡され得る。] [0015] 図2は、1つまたは複数の実施形態における、ファシリティによって実行される決定論的シリアル化プロセス200のフロー図である。例えば、決定論的シリアル化プロセス200は、マルチスレッドアプリケーションがマルチプロセッシングシステム上で実行している間に実行され得る。マルチスレッドアプリケーションが実行している間、ファシリティは、スレッドごとにステップ205〜215をループする。ステップ205で、トークンの値がスレッドの識別子に一致することをファシリティが決定した場合、ファシリティはステップ210に進み、そうでない場合、ファシリティは折り返してステップ205に戻る。すなわち、ファシリティは、トークンの値がそのスレッドの識別子に一致するまで、スレッドの実行を一時停止する。ステップ210で、ファシリティは、識別子がトークンに一致するスレッドが決定論的な有限数の操作(すなわち量子)を実行できるようにし、次いでファシリティは、ステップ215に進む。ステップ215で、ファシリティは、トークンの値を、決定論的な順序で次のスレッドの識別子に等しくなるように設定し、次いでファシリティは、ステップ205に進む。ファシリティは、アプリケーションが終了するまで、シリアル化プロセス200をループし続けることができることに留意されたい。] 図2 [0016] 図2および以下のフロー図のそれぞれに示されるステップは様々な方法で変更され得ることを、当業者であれば理解されたい。例えば、いくつかのステップの順序が並べ替えられてもよく、いくつかのサブステップが並行して実行されてもよく、いくつかの示されたステップが省略されてもよく、または他のステップが含まれていてもよい。] 図2 [0017] いくつかの実施形態において、ファシリティは、マルチスレッドアプリケーションの実行を選択的にシリアル化する。すなわち、ファシリティは、他のスレッド操作が並行して実行される間に、いくつかのスレッド操作のインターリービングを制御する(本明細書では「制御された操作」と呼ばれる)ことができる。例えば、ファシリティは、2つ以上のスレッド間の通信を伴う操作のインターリービングを制御することができる。スレッド間通信は、スレッドが別のスレッドによってプライベートに保持されるデータを読み取るとき、またはスレッドが共有データに書き込み、それをプライベート化するときに起こる。いくつかの実施形態において、スレッドが別のスレッドによってプライベートに保持されるとみなされるデータを読み取ろうと試みるとき、スレッドは、トークンの値がその識別子に一致するまで、その実行を一時停止する。同様に、いくつかの実施形態において、スレッドは、共有される、または別のスレッドによってプライベートに保持されるとみなされるデータに書き込もうと試みるとき、トークンの値がその識別子に一致し、すべての他のスレッドがその実行における決定論的ポイントに到達する(例えば、量子の実行を終了する)まで、その実行を一時停止する。その結果、ファシリティは、すべてのスレッドが、その実行での決定論的ポイントにおけるデータの状態の変化(共有からスレッドによってプライベートに保持されるまで)を観察することを確実にする。] [0018] いくつかの実施形態において、スレッド間通信を検出するために、ファシリティは、マルチスレッドアプリケーションのアドレス空間におけるメモリロケーションごとに、共有情報を含む共有メモリデータ構造を維持する。例えば、こうした情報は、メモリロケーションが共有である、プライベートであるなどを示すことができる。共有は、操作レベル、命令レベル、ページレベルなど、様々なレベルで起こり得ることに留意されたい。いくつかの実施形態において、スレッドは、それ自体のプライベートに保持されたデータにアクセスすることも、トークンを保持することなく共有データを読み取ることもできる。しかし、共有データに書き込むために、または別のスレッドによってプライベートとして保持されるデータを読み取るために、スレッドは、トークンを保持し、すべての他のスレッドがブロックされるまで待つ(すなわち、他のスレッドもそのトークンを待っている)。スレッドが、プライベートとみなされるメモリロケーションを読み取るとき、共有メモリデータ構造は、読み取られたメモリロケーションを共有されたものとみなすべきであることを示すために更新される。スレッドがメモリロケーションに書き込むとき、メモリロケーションをそのスレッドによってプライベートに保持されているものとみなすべきであることを示すために、共有メモリデータ構造が更新される。同様に、スレッドが別のスレッドによってこれまではアクセスされていないメモリロケーションを読み取るとき、共有メモリデータ構造は、メモリロケーションをそのスレッドによってプライベートに保持されているものとみなすべきであることを示すために更新される。] [0019] 図3は、1つまたは複数の実施形態における、ファシリティによって実行される決定論的選択的シリアル化プロセス300のフロー図である。例えば、スレッドまたはプロセッサが、メモリ操作、システムコールなど、制御された操作を実行しようと試行すると、選択的シリアル化プロセス300が実行され得る。ステップ305で、操作がシステムコールである(例えばI/O操作など)ことをファシリティが決定した場合、ファシリティはステップ325に進み、そうでない場合、ファシリティはステップ310に進む。ステップ310で、操作がスレッドによってプライベートに保持されていないメモリにアクセスするとファシリティが決定した場合、ファシリティはステップ315に進み、そうでない場合、ファシリティはステップ355に進む。ステップ315で、操作が共有メモリにアクセスしたことをファシリティが決定した場合、ファシリティはステップ320に進み、そうでない場合、ファシリティはステップ325に進む。ステップ320で、操作が格納操作であることをファシリティが決定した場合、ファシリティはステップ325に進み、そうでない場合、ファシリティはステップ355に進む。ステップ325で、トークンの値がスレッドの識別子に一致することをファシリティが決定した場合、ファシリティはステップ330に進み、そうでない場合、ファシリティは折り返してステップ325に戻る。すなわち、ファシリティは、トークンの値が選択されたスレッドの識別子に一致するまで、選択されたスレッドの実行を一時停止する。ステップ330で、マルチスレッドアプリケーションのすべてのスレッドが一時停止(またはブロック)されたことをファシリティが決定した場合、ファシリティはステップ335に進み、そうでない場合、ファシリティは折り返してステップ330に戻る。トークンを保持するスレッドが実行し得る前に、すべてのスレッドが一時停止されるのを待つことによって、ファシリティは、実行における決定論的ポイントで、すべてのスレッドが操作の実行に起因する任意の状態の変化を観察することを確実にする。ステップ335で、操作がシステムコールであることをファシリティが決定した場合、ファシリティはステップ355に進み、そうでない場合、ファシリティはステップ340に進む。ステップ340で、操作が格納操作であることをファシリティが決定した場合、ファシリティはステップ345に進み、そうでない場合、ファシリティはステップ350に進む。ステップ345で、ファシリティは、操作によって影響を受けるメモリロケーションを、スレッドによってプライベートに保持されているものとみなすべきであることを示すために、共有メモリデータ構造を更新し、次いで、ファシリティはステップ355に進む。ステップ350で、ファシリティは、操作によってアクセスされたメモリロケーションを共有されたものとみなすべきであることを示すために、共有メモリデータ構造を更新し、次いでファシリティはステップ355に進む。ステップ355で、ファシリティによって、スレッドは操作を始めることができ、次いでファシリティは戻る。] 図3 [0020] いくつかの実施形態において、ファシリティは、トランザクショナルメモリシステムと共に動作して、マルチスレッドアプリケーションの実行をシリアル化または選択的にシリアル化する。例えば、ファシリティは、トランザクショナルメモリシステムを使用して、メモリ操作の決定論的順序を侵害することになるスレッド間通信を検出することができる。すなわち、共有メモリデータ構造の代わりに、またはそれに加えて、トランザクショナルメモリシステムが使用され得る。トランザクショナルメモリシステムは、ハードウェアトランザクショナルメモリ(HTM)システム、ソフトウェアトランザクショナルメモリ(STM)システム、またはハイブリッドハードウェア−ソフトウェアトランザクショナルメモリシステム(HS−TM)とすることができることに留意されたい。トランザクショナルメモリシステムと共に動作するとき、ファシリティは、スレッドによって実行される各量子をトランザクション内に封入する。各量子をトランザクション内に封入することによって、スレッドは、アトミック的に、かつ隔離されて実行するようにみえる。その結果、トランザクションは、並行して実行され、次いで、決定論的順序に従ってコミットされ得る。通常、トランザクションは、決定論的順序を侵害することになる(本明細書では「競合」と呼ばれる)スレッド間通信を含む場合、コミットされない。競合が存在するとき、トランザクションは、中止され、再開される。] [0021] いくつかの実施形態において、ファシリティは、量子ビルダコンポーネント(quantum builder component)、および決定論的マルチプロセッシング(「DMP」)コンポーネントを含む。量子ビルダコンポーネントは、マルチスレッドアプリケーションの実行を量子(すなわち、決定論的な有限数の操作の組)に分割するために使用される。いくつかの実施形態において、量子ビルダコンポーネントは、例えば通信無しのスレッド操作など、並行して実行され得る操作と、スレッド間通信、システムコールなど、決定論的な順序で実行されるべき操作(例えば、制御された操作)とを区別する。DMPコンポーネントは、決定論的順序に従って各量子が実行されることを確実にする。いくつかの実施形態において、トークンがブロックされた(例えば、別のスレッドによって保持されたロックを待つ)スレッドに進められると、ファシリティは、トークンを次のスレッドに渡し、それによって、開発者がマルチスレッドコード内に含まれる同期プリミティブのブロックに起因するライブロックを回避する。例えば、トークンがスレッド2に渡されるときにスレッド2が進むために必要とするロックをスレッド1が保持する場合、トークンは、次のスレッド(例えば、スレッド3)に渡される。トークンが決定論的順序で渡されるため、また各スレッドが量子を実行する(またはトークンを渡す)ため、量子は、決定論的にインターリーブされ、それによってコードが同じ入力で実行されるたびに同じ出力を生成し、ライブロックを防ぐ。] [0022] 量子ビルダコンポーネントおよびDMPコンポーネントは、ハードウェア、ソフトウェア、またはハードウェアおよびソフトウェアの組み合わせにおいて実装され得る。例えば、量子ビルダコンポーネントは、命令が後退するにつれてそれらをカウントし、所定の量子サイズに到達したとき、量子境界を配置することによって実装され得る。実行をシリアル化するために、DMPコンポーネントは、決定論的順序で量子境界においてプロセッサ間に渡されるトークンとして実装され得る。別の例として、実行を選択的にシリアル化するために、量子ビルダコンポーネントは、アクセスがスレッド間通信を伴うかどうか(例えば、共有データへのアクセスなど)を決定するために、メモリアクセスを監視することができる。例えば、一実施形態において、量子ビルダは、共有テーブルを実装するために、MESI(「変更、排他、共有、無効」)キャッシュコヒーレンスプロトコルによって維持されるキャッシュライン状態を使用する。排他または変更状態のキャッシュラインは、プロセッサによってプライベートに保持されるものとみなされ、トークンを保持しないそれ自体のスレッドによって自由に読み取られ、または書き込まれ得る。同様に、共有状態のキャッシュラインは、トークンを保持しないそれ自体のスレッドによって自由に読み取られ得る。すべてのスレッドがその実行における決定論的ポイントにあるとき(例えば、すべてのプロセッサがブロックされたとき)、およびプロセッサが決定論的トークンを取得したとき、プロセッサは、共有状態のキャッシュラインに書き込むことができる。こうした実施形態において、各プロセッサは、それがブロックされ、および/またはブロック解除されると、ブロードキャストする。任意のプロセッサによってキャッシュに入れられないラインに対応する共有テーブルにおけるエントリの状態は、メモリに保持され、メモリコントローラによって管理することができ、こうしたエントリの状態は、キャッシュミスが処理されるときに転送され得ることに留意されたい。いくつかの実施形態において、量子ビルダおよびDMPコンポーネントは、ハードウェアトランザクショナルメモリ(HTM)システムなどのトランザクショナルメモリ(TM)システムと共に動作して、特定のトランザクションコミット順序、すなわちトランザクション内に封入された量子の決定論的コミット順序を指定する。こうした実施形態において、TMシステムは、プロセッサがトークンを保持するとき、トランザクションをコミットし、トランザクションがコミットされた後、トークンは、決定論的順序で次のプロセッサに渡される。いくつかの実施形態において、ハードウェアは複数のトークンをサポートすることができ、それによって、プロセッサ間に渡されるトークンをそれぞれ指定する複数の決定論的プロセスが同時に実行できるようになることに留意されたい。] [0023] いくつかの実施形態において、ファシリティは、コンパイラまたはバイナリ書き換えインフラストラクチャを使用して実装され得る。例えば、量子ビルダコンポーネントは、マルチスレッドアプリケーションコード内に同期コードを挿入し、コンパイラによって生成される制御フローグラフ(「CFG」)において操作を追跡することによって、コンパイラを使用して量子を構築することができる。量子は、サイズが決定論的である限り、均一サイズのものである必要はないことに留意されたい。こうした同期コードは、例えば、関数呼び出しの最初および最後、およびCFG後退エッジの最後に挿入することができる。挿入されたコードは、量子サイズを追跡し、ターゲットサイズに到達したとき、DMPコンポーネントにコールバックする。例えば、実行のこうした実施形態をシリアル化するために、DMPコンポーネントは、決定論的順序でスレッド間に渡される待ち行列ロックとしてトークンを実装することができる。別の例として、実行を選択的にシリアル化するために、量子ビルダコンポーネントは、ロード操作および格納操作がDMPコンポーネントへのコールバックをもたらすように、コンパイラを使用して、コードを挿入することができる。いくつかの実施形態において、DMPコンポーネントは、ソフトウェアトランザクショナルメモリ(STM)システムなどのトランザクショナルメモリシステムと共に動作し、および/または共有テーブルを実装する。] [0024] いくつかの実施形態において、スレッドによって実行される操作のインターリービングを制御するために、ファシリティは、ソースコード、ソースコードの中間表現、または実行ファイルを増補することができる。例えば、ファシリティは、1つまたは複数の決定論的マルチプロセッシング(「DMP」)関数またはデータ構造をアプリケーションコードに挿入することによって、マルチスレッドアプリケーションコードを増補することができる。別の例として、挿入されたDMP関数は、1つまたは複数のデータ構造(例えば、共有メモリデータ構造)を維持する、DMPコンポーネントによって提供されるものなど、ランタイムシステムにコールバックすることができる。増補されたコードがマルチプロセッシングシステムによって実行されると、挿入されたDMP関数およびデータ構造は、次いで、メモリおよびI/O操作、システムコールなど、操作が実行される順序を制御するために使用される。スレッドがこうした動作を実行する順序を制御することによって、ファシリティは、マルチスレッドアプリケーションが決定論的に挙動できるようにする(本明細書では、「増補されたアプリケーション」と呼ばれる)。すなわち、同じ入力が与えられると、増補されたアプリケーションのスレッドは、操作の一部またはすべてを決定論的にインターリーブし、それによって同じ出力を提供することができる。ファシリティは他のスレッド操作を制御するように拡張され得ることを、当業者であれば理解されたい。] [0025] いくつかの実施形態において、ファシリティは、増補されたアプリケーションのスレッドによって実行される量子の決定論的実行を実施する、DMPライブラリによって提供される関数を挿入することによって、マルチスレッドアプリケーションコードを増補するコンパイラモジュールとして実装される。いくつかの実施形態において、コードが増補された後、コンパイラは、例えば、DMPライブラリに対するすべての呼び出しをインライン化するなど、コードを再度最適化する。コンパイラは本明細書では具体的に記載されない増補されたコードへの他の最適化を実行することができることを、当業者であれば理解されたい。] [0026] いくつかの実施形態において、ファシリティは、本明細書では「スレッドデータ構造」と呼ばれるDMPデータ構造を含み、その詳細は、図6を参照して以下でより詳しく説明される。しかし、任意の数のDMPデータ構造が含まれていてよいことに留意されたい。スレッドデータ構造が複数のDMPデータ構造を表し得ることにさらに留意されたい。いくつかの実施形態において、スレッドデータ構造は、実行中に増補されたアプリケーションによって作成される各スレッドに対応するスレッド識別子(「ID」)を格納する。例えば、スレッドデータ構造は、配列、リンクリスト、キュー、またはスレッドIDの他のデータ構造(本明細書では「スレッドコンテナ」と呼ばれる)を含み得る。] 図6 [0027] いくつかの実施形態において、スレッドデータ構造は、量子の実行の順序を制御するために使用され得るトークンを含む。例えば、いくつかの実施形態において、量子を実行する前に、スレッドは、トークンの現在の値がスレッドのIDに一致するかどうかを決定する。スレッドのIDがトークンの現在の値に一致するとき、スレッドは、量子を実行することができる。そうでない場合、スレッドは、トークンの現在の値がその識別子に一致するまで、量子を実行するのを待つ。] [0028] いくつかの実施形態において、スレッドが作成される順序は、スレッドが決定論的に実行される順序に対応する。例えば、各スレッドが作成されるとき、スレッドの対応するスレッドIDは、スレッドコンテナ内に順次格納され得る(例えば、最初に作成されたスレッドのスレッドIDは1、2番目に作成されたスレッドのスレッドIDは2など)。操作が実行されるとき、スレッドは、(第1のスレッドIDから開始して)スレッドIDが格納される順序に基づいてスレッドコンテナに格納されるスレッドIDを順次ループすることによって、トークンの値を進めるよう動作するいくつかのDMP関数を呼び出すことができる。スレッドが存在するとき、通常、スレッドの対応するIDがスレッドコンテナから削除されることに留意されたい。] [0029] いくつかの実施形態において、スレッドデータ構造は、トークンが進められる前にスレッドIDがトークンの現在の値に一致するスレッドによって実行され得る決定論的な有限数の(すなわち量子)制御された操作またはブロックに対応する値を格納する。制御された操作またはブロックのこの数は、本明細書では「コミットブロックサイズ」と呼ばれる。コミットブロックサイズは、1つからN個までの制御された操作またはブロックに及び得る。大きいコミットブロックサイズおよび小さいコミットブロックサイズには性能のトレードオフが関連することを、当業者であれば理解されたい。例えば、コミットブロックサイズが小さすぎるとき、スレッド間でのコンテキストの切り替えに伴うオーバーヘッドの結果として、増補されたアプリケーションの性能が悪化する。別の例として、コミットブロックサイズが大きすぎるとき、多くのまたはすべてのスレッドは、スレッドIDがトークンに一致するスレッド(およびスレッドIDがそのスレッドIDに先行するすべてのスレッド)がコミットブロックサイズによって指定された数の制御された操作を終了する、または実際に実行するのを待つのを余儀なくされ得るため、増補されたアプリケーションの性能が悪化する。少なくとも1つの実施形態において、コミットブロックサイズは、1,000に等しい。] [0030] いくつかの実施形態において、コミットブロックサイズは、構成可能である。例えば、コミットブロックサイズは、増補されたアプリケーションの様々なスレッドインターリービングをプログラム的に操作し、テストするように、ソフトウェア開発者によって構成され得る。別の例として、コミットブロックサイズは、増補されたアプリケーションによって作成され得る最大数のスレッド、および/または増補されたアプリケーションが実行するマルチプロセッシングシステムのプロセッサまたはコアの数に基づいて、自動的に構成され得る。スレッドによって実行される制御された操作の数をカウントするために様々な技術が使用され得ることを、当業者であれば理解されたい。例えば、いくつかの実施形態において、スレッドデータ構造は、スレッドIDが現在のトークンIDに一致するスレッドによって実行された制御された操作の数に対応する値を含む。スレッドが制御された操作を実行するたびに、制御された操作の数は、増分され、コミットブロックサイズと比較される。制御された操作の数がコミットブロックサイズに等しい場合、トークンは、次のスレッドIDに進められ、制御された操作の数は、ゼロにリセットされる。] [0031] マルチスレッドアプリケーションを増補して、いくつかのスレッドの操作(例えば、制御されたスレッド操作)の順序を制御することによって、開発プロセスは、かなり簡略化される。例えば、ファシリティは、マルチスレッドアプリケーションのスレッドインターリービングを直接操作し、それによってマルチスレッドアプリケーションの実質的により良いテストカバレージを可能にできるようにするために、ソフトウェア開発者によって使用され得る。開発者は、例えばコミットブロックサイズを変更することによって、制御されたスレッド操作のインターリービングを操作することができる。別の例として、開発者は、スレッドコンテナに格納されるスレッドIDの順序を変更することによって、制御されたスレッド操作のインターリービングを操作することができる。いくつかの実施形態において、ファシリティによって、ソフトウェア開発者は、挿入されたコードが量子構築物に影響を与えないように、増補のために挿入されたとコードをマーク付けすることができる。] [0032] いくつかの実施形態において、マルチスレッドアプリケーションは、その増補された形で配置される。マルチスレッドアプリケーションを増補された形で配置することによって、アプリケーションの信頼性は、実質的に向上する。というのは、例えば、「現場での」(すなわち顧客による)増補されたアプリケーションの実行は、社内でのアプリケーションのテストに、より似たものになるからである。さらに、マルチスレッドアプリケーションがクラッシュする、または同期バグを経験するとしたら、ソフトウェア開発者は、顧客から意味のあるクラッシュ情報を集めることによって欠陥を迅速に解決することができる。すなわち、増補された形で配置されると、クラッシュに先行する顧客によって実行されるアクションは、ソフトウェア開発者がクラッシュを容易に再生することができるようになるため、意味がある。その結果、ソフトウェア開発者は、クラッシュまたは同期バグがスレッドの未知のインターリービングに関連付けられた場合より実質的に早く欠陥を解決することができる。したがって、ファシリティは、マルチスレッドアプリケーションの開発および配置の両方を向上させる。] [0033] いくつかの実施形態において、マルチスレッドアプリケーションが開発される、および/またはマルチスレッドアプリケーションが配置されるコンピューティングシステムは、共有メモリへのアクセスを制御するためのトランザクショナルメモリ(「TM」)システムを含む。トランザクショナルメモリシステムは、ハードウェアトランザクショナルメモリ(「HTM」)、ソフトウェアトランザクショナルメモリ(「STM」)システム、またはハイブリッドハードウェア−ソフトウェア(HS−TM)システムとすることができる。両方のTMシステムは、当分野で知られている。STMシステムは、プログラミングアブストラクション(programming abstraction)を提供し、それを介して、スレッドは、共有リソースをロックすることなく、または共有リソースが解放されるのを待つことなく、その一部に1つまたは複数の共有リソース(例えばメモリ)が関与し得る操作のシーケンスをアトミック的に実行する。] [0034] 従来のTMシステムは、他のスレッドが何をしているかに関係なく、スレッドが共有メモリへの変更を終了するという点で「楽観的」である。これは、例えば、マルチスレッドアプリケーションのスレッドごとにログを維持することによって達成され、トランザクションごとに、各スレッドは、その対応するログにその操作を順次記録する。例えば、ログは、メモリロケーションの数、並びにトランザクション中にスレッドが読み取り、および/または書き込む値を含み得る。トランザクションの最後に、他のスレッドが同じ共有メモリロケーションに並行してアクセスしなかった場合、スレッドは、実際に、操作のシーケンスを実行する(これは一般に「コミット」と呼ばれる)。しかし、別のスレッドが同じメモリロケーションのうちの1つまたは複数に並行してアクセスした場合、トランザクションは、中止され、再開される。すなわち、従来のTMシステムにおいて、同じトランザクション中に共有リソースが複数のスレッドによってアクセスされない限り、トランザクションは、並行して実行する。] [0035] 従来のTMシステムに関連付けられた欠点がいくつかある。例えば、従来のTMシステムは、開発者がいくつかの操作、またはいくつかの操作のシーケンスをアトミックとして宣言できるようにすることによって、開発をある程度簡略化するが、従来のTMシステムは、マルチスレッドアプリケーションの決定論的マルチプロセッシングを提供しない。さらに、従来のTMシステムでは、ソフトウェア開発者は、マルチスレッドアプリケーションにおけるスレッドのインターリービングを指定し、または操作することができない。その結果、従来のTMシステムは、潜在的な同期バグにも苦しむ。また、HTMシステムと比較すると、STMシステムは、ログの維持に伴うオーバーヘッド、およびトランザクションのコミットに費やされた時間の結果、パフォーマンスヒットを被る。] [0036] いくつかの実施形態において、ファシリティは、HTM、STM、HS−TMシステムなど、共有リソースへのアクセスを制御するためにトランザクショナルメモリシステムを使用するマルチスレッドアプリケーションのいくつかのスレッド操作の実行の順序を制御する。すなわち、ファシリティは、スレッドが開始する、および/またはトランザクショナルメモリシステムにおけるトランザクションをコミットする順序を制御することができる。いくつかの実施形態において、ファシリティは、STMシステムによって提供されるアプリケーションプログラミングインターフェイス(「API」)を増補する。一例として、ファシリティは、以下の表1に示されたSTM APIの関数を増補することができる。ファシリティのいくつかの実施形態は、表1に提供されるSTM APIを参照して記載されるが、ファシリティは様々なトランザクショナルメモリシステムにおいて動作し得ることを、当業者であれば理解されたい。] [0037] ] [0038] いくつかの実施形態において、ソフトウェア開発者は、マルチスレッドアプリケーション内のアトミックブロックを手動で指定する。例えば、ソフトウェア開発者は、以下のアトミックブロックを含み得る。] [0039] ] [0040] コンパイル後、上記のアトミックブロック例は、以下の擬似コードによって置き換えられることになる。] [0041] ] [0042] いくつかの実施形態において、トランザクションのうちの1つまたは複数(すなわち、アトミックブロック)は、ソフトウェア開発者に可視ではない。例えば、これらは、コンパイラ、ランタイム、TMシステム、またはその何らかの組み合わせによって挿入され得る。いくつかの実施形態において、ブロックがソフトウェア開発者によって指定されたか、それともコンパイラ、ランタイム、またはTMシステムによって挿入されたかにかかわらず、アトミックブロックは、増補される。いくつかの実施形態において、スレッドがSTMAPIの増補された関数を呼び出すと、関数は、トークンの現在の値に対応するスレッドIDをチェックするDMP関数に制御を転送し、これは、トランザクションを開始し、および/または決定論的にコミットするために使用される。多くの異なる技術はトランザクションをインターセプトするために使用され得ることを、当業者であれば理解されたい。例えば、いくつかのSTM APIは、API関数の実行前および/または後に、制御をDMP関数に転送するために、フックが登録され得るコールバック機構を提供する。] [0043] 増補されたトランザクショナルメモリシステムのトランザクションは、サイズが決定論的である。すなわち、各スレッドは、ブロックにおいて特定数の操作(本明細書では「コミットブロックサイズ」と呼ばれる)を実行し、次いでスレッドは、IDがトークンの現在の値に一致するスレッドで開始して、決定論的にコミットしようと試みる。トランザクションが有効であり、スレッドIDがトークンに一致する場合、スレッドは、STM_Commit_Transaction()を呼び出す。トランザクションがコミットされた後、トークンは、次のスレッドIDに進められる。しかし、トランザクションが無効である場合(例えば、スレッドがそのトランザクション中に別のスレッドによって書き込まれたロケーションから読み取ったため)、スレッドはSTM_Abort_Transaction()を呼び出す。通常、スレッドIDがトークンに一致するスレッドがその対応するトランザクションを正常にコミットするまで、トークンは進められないことに留意されたい。] [0044] いくつかの実施形態において、トークンの現在の値がトランザクションを実行するスレッドのスレッドIDに一致しない場合、いくつかのタイプの操作は、トランザクションに即座に中止させる。例えば、トランザクションがI/O操作など元に戻すことができない操作を含むとき、トランザクションを実行するスレッドは、そのスレッドIDがトークンに一致するかどうかを決定する。そのスレッドIDがトークンに一致する場合、トランザクションは、続行し得る。そうでない場合、トランザクションは、自動的に中止され得る。] [0045] いくつかの実施形態では、中止されたスレッド以降のスレッドIDを有するすべてのスレッドが中止され、一方、別の実施形態では、並行のトランザクションが同じ共有リソースにアクセスしたスレッドのみが中止され、再開される。通常、スレッドIDがトークンに一致するスレッドがその対応するトランザクションを正常にコミットするまで、トークンは進められない。その結果、それらのトランザクションを中止しなかった中止されたスレッド以降のスレッドIDを有する任意のスレッドは、STM_Commit_Transaction()を呼び出す前に、トークンがそのスレッドIDに一致するのを待つ。] [0046] HTMを有するコンピューティングシステムにおいて増補されたアプリケーションが実行されると、増補されたアプリケーションは、実質的に性能のペナルティなく、決定論的に実行され得ることに留意されたい。その結果、ソフトウェア開発者および/または製造業者は、スレッドインターリービングの可能性について徹底的にテストしたことを知っているマルチスレッドアプリケーションを配布することができる。したがって、同期バグがマルチスレッドコードに残っている場合でさえ、顧客には見えない。] [0047] より詳しくファシリティについて説明する前に、ファシリティを実施することができる環境について検討することが有用である。図4は、1つまたは複数の実施形態における、ファシリティが実行するコンピューティングシステム400のアーキテクチャ例を示す高レベルブロック図である。説明を曖昧にするのを回避するために、いくつかのよく知られている構造および機能は、詳細に示されても述べられてもいない。コンピューティングシステム400は、相互接続システム415に結合された1つまたは複数のプロセッサ405およびメモリ410を含む。プロセッサ405は、コンピューティングシステム400の中央処理装置(「CPU」)であり、したがってその操作全体を制御する。いくつかの実施形態において、プロセッサ405は、メモリ410に格納されたソフトウェアを実行することによってこれを達成する。いくつかの実施形態において、コンピューティングシステム400は、単一の集積回路(「ダイ」と呼ばれる)から成るパッケージ、ひとまとめにされた1つまたは複数のダイ、複数のパッケージなどに2つ以上の独立したコアを有するプロセッサ405を含む。いくつかの実施形態において、コンピューティングシステム400は、単一のコアのみを有するにもかかわらず、マルチコアプロセッサとして実行することができるハイパースレッドプロセッサ405を含む。プロセッサ405は、1つまたは複数のプログラム可能な汎用または専用マイクロプロセッサ、デジタル信号プロセッサ(「DPS」)プログラム可能コントローラ、特定用途向け集積回路(「ASIC」)、プログラム可能論理装置(「PLD」)など、またはこうした装置の組み合わせとすることができ、またはそれらを含み得る。] 図4 [0048] 図4に示される相互接続システム415は、適切なブリッジ、アダプタ、および/またはコントローラによって接続される任意の1つまたは複数の個別の物理バスおよび/またはポイントツーポイント接続を表す抽象概念である。相互接続システム415は、例えば、システムバス、ある形の周辺機器コンポーネント相互接続(PCI)バス、ハイパートランスポートまたは業界標準アーキテクチャ(ISA)バス、小型コンピュータシステムインターフェイス(SCSI)バス、ユニバーサルシリアルバス(USB)、電気電子技術者協会(IEEE)標準1394バス(時として「FireWire」と呼ばれる)などを含み得る。] 図4 [0049] システムメモリ410は、プログラムおよびデータが使用されている間にそれらを格納するためのメモリ420、プログラムおよびデータを永続的に格納するためのハードドライブなどの固定記憶装置425、およびコンピュータ可読媒体に格納されるプログラムおよびデータを読み取るためのCD−ROMまたはDVD−ROMドライブなどのコンピュータ可読媒体ドライブ430を含む。本明細書で使用される場合、システムメモリ410は、任意の形の揮発性、不揮発性、取外式、および固定式媒体、またはコンピュータ可読命令、データ構造、プログラムモジュール、およびコンピューティングシステム400の他のデータなどの情報を格納することができるこうした媒体装置の任意の組み合わせを含む。] [0050] また、プロセッサ405には、相互接続システム415を介して、ネットワークアダプタ435、1つまたは複数の入力装置および出力装置(「I/O装置」)440も結合される。ネットワークアダプタ435は、コンピューティングシステム400に、ネットワークを介して他のコンピューティングシステムと通信することができる機能を提供し、例えば、Ethernet(登録商標)アダプタとすることができる。I/O装置440は、コンピューティングシステム400のユーザに、システムメモリ410に格納されるプログラムおよびデータにアクセスすることができる機能を提供する。例えば、I/O装置440は、キーボード、ポインティング装置、マイクロフォンなどの入力装置、および表示装置、スピーカ、プリンタなどの出力装置を含み得る。上述したように構成されたコンピューティングシステムは、通常、ファシリティの操作をサポートするために使用されるが、様々なタイプおよび構成の装置を使用して、様々なコンポーネントを有するファシリティが実装され得ることを、当業者であれば理解されたい。] [0051] 図5は、1つまたは複数の実施形態における、決定論的マルチプロセッシングレイヤ500の様々な機能的要素を示す高レベルブロック図である。決定論的マルチプロセッシングレイヤ500はコンピューティングシステム400によって実装される必要がないことに留意されたい。例えば、いくつかの実施形態において、決定論的マルチプロセッシングレイヤ500は、マルチスレッド型ソフトウェアコードが入力として提供される個別のコンピューティングシステムに実装される。] 図5 [0052] いくつかの実施形態において、決定論的マルチプロセッシングレイヤ500は、量子ビルダコンポーネント505および決定論的マルチプロセッシング(「DMP」)コンポーネント510を含む。量子ビルダコンポーネント505は、例えば、DMPコンポーネント510によって提供される関数515〜540のうちの1つまたは複数を使用して、マルチスレッドアプリケーション545のコードを増補するコンパイラモジュールとして実装され得る。DMPコンポーネント510によって提供される関数は様々な方法で変更され得ることを、当業者であれば理解されたい。例えば、いくつかの関数がマージまたは分割されてもよく、いくつかの関数が省略されてもよく、いくつかの関数が追加されてもよい。いくつかの実施形態において、量子ビルダコンポーネント505は、例えば低レベル仮想マシン(「LLVM」)コンパイラインフラストラクチャ内など、コンパイラインフラストラクチャ内にコンパイラパスとして実装される。一方、他の実施形態では、量子ビルダコンポーネント505は、マルチスレッドアプリケーションコード545が入力として提供される個別のシステムによって実装される。] [0053] 示された実施形態において、決定論的マルチプロセッシングレイヤ500は、マルチスレッドアプリケーションコード410を受信し、および/またはそれにアクセスする。マルチスレッドアプリケーションコード545は1つまたは複数のコードファイルを表し得ることに留意されたい。コード545は、マルチスレッドアプリケーションのソースコード、マルチスレッドアプリケーションのソースコードの中間表現(「IR」)、マルチスレッドアプリケーションの実行ファイルなどとすることができる。いくつかの実施形態において、量子ビルダコンポーネント505は、マルチスレッドアプリケーションコード545内に同期コードを挿入して、コンパイラによって生成される制御フローグラフ(「CFG」)において操作を追跡することによって、コンパイラを使用して量子を構築することができる。挿入されたコードは、量子サイズを追跡し、量子サイズに到達したとき、DMPコンポーネント510によって提供される1つまたは複数の関数を呼び出して、アプリケーション内のスレッドの前進を制御する。DMPコンポーネント510は、ランタイムシステムを提供することができ、および/またはDMP関数515〜540のうちの1つまたは複数をコード545に挿入することができる。いくつかの実施形態において、決定論的プロセッシングレイヤ500は、トランザクショナルメモリシステムと共に動作し、および/または共有テーブルを実装する。] [0054] 示された実施形態において、DMPライブラリは、DMP開始関数(「DMP_Function_Start()関数515」)、DMP初期化関数(「DMP_Init()関数520」)、DMP格納関数(「DMP_Store()関数525」)、DMPロード関数(「DMP_Load()関数530」)、DMPコミット関数(「DMP_Commit()関数535」)、およびDMP終了関数(「DMP_Function_End()関数540」)を含む。DMP開始関数515および終了関数540は、アプリケーション関数が開始し、終了するときを画定するために使用され得る。DMPロード関数530は、ロード操作が実行される、または実行された決定論的マルチプロセッシングレイヤ500に運ぶために使用され得る。同様に、DMP格納関数525は、格納操作が実行される、または実行された決定論的マルチプロセッシングレイヤ500に運ぶために使用され得る。DMP格納関数525およびロード関数530は、メモリ操作の順序を制御し、それによってこうした操作の決定論的実行を実施するために使用される。DMP初期化関数520およびDMPコミット関数535は、メモリ操作の順序を制御する、またはトランザクションを開始し、または終了するために使用されるコードのブロックを画定するために使用され得る。DMPコンポーネント510によって提供される関数は様々な方法で変更され得ることを、当業者であれば理解されたい。例えば、いくつかの関数がマージまたは分割されてもよく、いくつかの関数が省略されてもよく、いくつかの関数が追加されてもよい。] [0055] いくつかの実施形態において、量子ビルダコンポーネント505は、以下の表2に列挙されるDMPコンポーネント510の関数515〜540を挿入する。] [0056] ] [0057] いくつかの実施形態において、量子ビルダコンポーネント505は、増補されたコードの中間表現を作成し、これは、例えば、制御フローグラフ(「CFG」)として表され得る。図11は、表2に従って増補されるマルチスレッドアプリケーションコード545の関数の制御フローグラフの一例を示す。いくつかの実施形態において、マルチスレッドアプリケーションコード545が増補された後、コンパイラは、例えばDMP関数515〜540への呼び出しをインライン化することによって、増補されたコードを再度最適化する。コンパイラは本明細書では具体的に記載されない増補されたコードへの他の最適化を実行することができることを、当業者であれば理解されたい。] 図11 [0058] いくつかの実施形態において、マルチスレッドアプリケーションコード545は、STM、HTM、またはHS−TMなど、トランザクショナルメモリシステムを使用して、スレッドによる共有リソースへのアクセスを制御する。こうした実施形態において、決定論的マルチプロセッシングレイヤ500は、トランザクションがマルチスレッドアプリケーションのスレッドによってコミットされる順序を制御するために使用され得る。例えば、量子ビルダ505は、DMP初期化関数520およびDMPコミット関数535への呼び出しを挿入することによってトランザクションにおける各量子を包むことができる。別の例として、マルチスレッドアプリケーションコード545が1つまたは複数のアプリケーションレベルトランザクショナルメモリブロックを含むとき、量子ビルダコンポーネント505は、ソフトウェア開発者によって宣言される各アトミックブロックの前にDMP初期化関数520への呼び出しを挿入することによって、また命令をコミットするためのTMシステムへの任意の呼び出しの前にDMPコミット関数535への呼び出しを挿入することによって、マルチスレッドアプリケーションコード545を増補することができる。さらに別の例として、決定論的マルチプロセッシングレイヤ500は、TMインターフェイスの関数への呼び出しをDMPコンポーネント510の1つまたは複数の関数515〜540への呼び出しで包むことによって、TMシステムによって提供されるインターフェイスを増補することができる。その結果、決定論的マルチプロセッシングレイヤ500がTMシステムと共に動作するとき、トランザクションは、決定論的に開始され、および/またはコミットされ得る。トランザクショナルメモリシステムがHTMシステムであるとき、HTMがこうした追跡を実行する限り、DMPロード関数530およびDMP格納関数525が含まれる必要はないことに留意されたい。] [0059] いくつかの実施形態において、マルチスレッドアプリケーションコード545は、実行可能な増補されたアプリケーション550にコンパイルされる。一方、他の実施形態では、増補されたアプリケーション550は、マシンに依存しない中間言語コードであり、これは、実行時に実行可能命令に変換される。増補後、増補されたアプリケーション550は、マルチプロセッシングシステム上で決定論的に実行され得る。すなわち、増補されたアプリケーション550に同じ入力が与えられると、マルチプロセッシングシステムは、スレッド量子を決定論的にインターリーブし、それによって、増補されたアプリケーション550が実行されるたびに同じ入力を生成する。図5に示されるコンポーネントは様々な方法で変更され得ることを、当業者であれば理解されたい。例えば、コンパイラなど、いくつかのコンポーネントがマージまたは分割されてもよく、いくつかのコンポーネントが省略されてもよく、いくつかのコンポーネントが追加されてもよい。] 図5 [0060] いくつかの実施形態において、DMPコンポーネント510によって提供される関数515〜540は、増補されたアプリケーションのスレッド間に決定論的にトークンを渡し、または進め、それによって各スレッドの前進を決定論的に制御する責任を負う。いくつかの実施形態において、これは、スレッドデータ構造600を使用することによって達成される。図6は、1つまたは複数の実施形態において、マルチプロセッサコードを決定論的にするためにファシリティによって使用されるスレッドデータ構造600を示す高レベルブロック図である。いくつかの実施形態において、スレッドデータ構造600は、スレッドコンテナ605を含む。スレッドコンテナは、実行中に増補されたアプリケーションによって作成されるスレッドごとにスレッドIDを格納する。スレッドコンテナ605は、配列、リンクリスト、キュー、またはスレッドIDの他のデータ構造として実装され得る。] 図6 [0061] いくつかの実施形態において、スレッドデータ構造600は、実行中に増補されたアプリケーションのスレッドによるトランザクションまたは制御された操作の実行の順序を制御するために使用されるトークン610を含む。例えば、いくつかの実施形態において、制御された操作を実行する、またはトランザクションをコミットする前に、スレッドは、そのスレッドIDがトークン610の現在の値に一致するかどうかを決定する。トークン610の現在の値がスレッドIDに一致するとき、対応するスレッドは、制御された操作を実行する、またはトランザクションをコミットしようと試行することができる。そうでない場合、対応するスレッドは、トークン610の現在の値がそのスレッドIDに一致するまで待つ。] [0062] いくつかの実施形態において、スレッドが作成される順序は、スレッドが決定論的に実行される順序に対応する。例えば、各スレッドが作成されるとき、スレッドの対応するスレッドIDは、スレッドコンテナ605に順次格納され得る。トランザクションまたは制御された操作が実行されるとき、実行中のスレッドが、例えばDMP_Commit()535などいくつかのDMP関数を呼び出し、こうした関数は、(第1のスレッドIDで開始して)スレッドIDが格納されたシーケンスに基づいてスレッドコンテナ605に格納されたスレッドIDを順次ループすることによって、トークン610の値を進めるように動作する。スレッドが終了すると、スレッドの対応するIDはスレッドコンテナ605から削除されることに留意されたい。] [0063] いくつかの実施形態において、スレッドデータ構造は、コミットブロックサイズ615を格納する。コミットブロックサイズ615は、トークンが進められる前に、スレッドIDがトークン610の現在の値に一致するスレッドによって実行され得る予め定められた数のトランザクションまたは制御された操作を表す。コミットブロックサイズ615は、1つのトランザクションまたは制御された操作からN個のトランザクションまたは制御された操作まで及び得る。少なくとも1つの実施形態において、コミットブロックサイズ615は、1,000に等しい。いくつかの実施形態において、コミットブロックサイズ615は、構成可能である。例えば、コミットブロックサイズ615は、マルチスレッドアプリケーションの様々なスレッドインターリービングをプログラム的に操作し、テストするように、ソフトウェア開発者によって構成され得る。別の例として、コミットブロックサイズ615は、増補されたアプリケーションによって作成され得る最大数のスレッド、および/または増補されたアプリケーションが実行するマルチプロセッシングシステムのプロセッサまたはコアの数に基づいて、自動的に構成され得る。] [0064] スレッドによって実行される制御された操作の数をカウントするために様々な技術が使用され得ることを、当業者であれば理解されたい。いくつかの実施形態において、スレッドデータ構造600は、スレッドコミットブロック620を含む。スレッドコミットブロック620は、スレッドIDが現在のトークンID610に一致するスレッドによって実行された制御された操作の数を表し得る。スレッドが制御された操作を実行するたびに、スレッドコミットブロック620の値は、増分され、コミットブロックサイズ615と比較される。スレッドコミットブロック620の値がコミットブロックサイズ615に等しい場合、トークン605は、次のスレッドIDに進められ、スレッドコミットブロック620の値は、ゼロにリセットされる。代替例として、スレッドコミットブロック620は、スレッドがその対応するトランザクションをコミットしようと試行する前に残っているブロックの数を表し得る。こうした実施形態において、スレッドコミットブロック620は、スレッドコンテナ605に格納されたスレッドIDを有するスレッドごとに残りのブロックの数を含み得る。次いで、スレッドは、ブロックを実行するたびに、その対応するスレッドコミットブロックを減分し、残りのブロックの数がゼロに等しいとき、そのトランザクションをコミットしようと試みる。] [0065] いくつかの実施形態において、スレッドデータ構造は、使用中スレッドブロック625を含み、これは、増補されたアプリケーションで実行中のスレッドの数を表す。いくつかの実施形態において、使用中スレッドブロック625は、スレッドが作成されるたびに増分される。同様に、使用中スレッドブロック625は、スレッドが終了するたびに減分される。一方、他の実施形態では、使用中スレッドブロック625は、スレッドコンテナ605のサイズに基づいて決定される。図6に示されるスレッドデータ構造600は様々な方法で変更され得ることを、当業者であれば理解されたい。例えば、いくつかの部分がマージまたは分割されてもよく、いくつかの部分が省略されてもよく、いくつかの部分が追加されてもよい。] 図6 [0066] 図7は、1つまたは複数の実施形態における、スレッドを作成し、決定論的に実行する一例を示す高レベル図である。説明を容易にするために、ある期間にわたるスレッドデータ構造600の一部分の内容が示される。トークン値610によって示されるように、スレッドが作成される順序は、スレッドが決定論的に実行される順序に対応する。] 図7 [0067] 示された例において、最初に作成されたスレッド(「スレッド1」)は、マルチスレッドアプリケーションのメインのアプリケーションスレッドを表す。説明を容易にするために、各スレッドのスレッドIDは、スレッドが作成された順序に等しい。すなわち、最初に作成されたスレッドのスレッドIDは1、2番目に作成されたスレッドのスレッドIDは2、3番目に作成されたスレッドのスレッドIDは3、などとなる。時刻T0とT1との間で、スレッド1が実行し、スレッド2が作成される。示された例において、スレッドの実行は、指定された数の制御された操作(例えば、コミットブロックサイズ615によって指定された量子)によって表される。したがって、図7に示される時間の増分は、必ずしも等しくない。各スレッドによって実行された未制御の操作の数は、異なっていてもよく、またその各実行期間中にスレッドごとに異なっていてもよいことにも留意されたい。] 図7 [0068] 図7に戻って、スレッド1がその量子の実行を終了する前のある時点でスレッド2が作成されたため、時刻T0とT1との間の使用中スレッド625の数は2である。その結果、スレッド1が終了すると、トークン610は、スレッドコンテナ605に格納された次のスレッドIDに進められた(すなわち、スレッド2)。] 図7 [0069] 時刻T1とT2との間で、スレッド2が実行し、次いでトークン610がスレッド1に戻される。時刻T2とT3との間で、スレッド1が実行し、次いでトークン610がスレッド2に進められる。時刻T3とT4との間で、スレッド2が実行し、次いでトークン610がスレッド1に戻される。] [0070] 時刻T4とT5との間で、スレッド1が実行し、スレッド2が作成される。時刻T4とT5との間でスレッド3が作成されるが、スレッド2は、時刻T5とT6との間で実行する。これは、スレッドが作成された順序が、スレッドが実行される順序に対応するからである。その結果、時刻T5とT6との間でスレッド2が実行し、次いで、トークン610がスレッド3に進められる。次いで時刻T6とT7との間でスレッド3が実行し、次いでトークン610がスレッド1に戻される。] [0071] 図8は、1つまたは複数の実施形態における、マルチプロセッサコードを決定論的にするためにトランザクショナルメモリシステムを使用する一例を示す高レベルブロック図である。説明を容易にするために、ある期間にわたるスレッドデータ構造600の一部分の内容が示される。また、説明を容易にするために、スレッドIDがスレッド1、スレッド2、スレッド3などのようにスレッドコンテナ605に配列されると仮定する。ある期間にわたってトークン値610によって示されるように、スレッドがトランザクションをコミットする順序は、決定論的である。説明を容易にするために、トークン610の最初の値は、スレッド1のスレッドIDに対応する。示された例において、各スレッドによって実行されるトランザクションは、サイズが決定論的である。すなわち、各スレッドは、特定の数のブロックを実行する。説明を容易にするために、コミットブロックサイズ615は2である。] 図8 [0072] 示されるように、時刻T0において、スレッド1〜3がトランザクションを開始する。スレッドがその対応するトランザクションを終了した後、スレッドは、そのトランザクションを決定論的にコミットしようと試行する。いくつかの実施形態において、各スレッドは、そのトランザクションが、スレッドにそのトランザクションをコミットさせないようにする競合をもたらしたかどうかを決定する。一方、他の実施形態では、この決定は、そのスレッドIDがトークン610の現在の値に一致するとき、スレッドによって行われる。例えば、これは、STMValidTransaction()を呼び出すことによって達成され得る。] [0073] 時刻T1で、トークン610の現在の値は、スレッド1のIDに一致する。したがって、示された例では、スレッド1は、そのトランザクションが、それにトランザクションをコミットさせないようにする競合をもたらしたかどうかを決定する。スレッド1およびスレッド2は、同じ共有メモリロケーション(すなわち、アドレスA)にアクセスしているが、スレッド1のトランザクションは有効である。これは、スレッド1がアドレスAに値を格納し、トークン610がそのスレッドIDに一致するからである。すなわち、(スレッド1によって実行される)Aの格納は、(スレッド2によって実行される)Aのロードによって影響されない。その結果、スレッド1は、そのトランザクションをコミットし(例えば、STMCommitTransaction()を呼び出すことによって)、次いでトークン610は、次のスレッドIDに進められる。しかし、トークン610は、スレッド2のスレッドIDに一致した場合、スレッド1は、そのトランザクションを中止することになる。これは、スレッド1がAを格納した後、スレッド2がAをロードしたかもしれないからである。トークン610がスレッド2のIDに一致すると仮定すると、スレッド1およびスレッド2は、そのトランザクションを中止することになる。この場合、スレッド2は、スレッド1の中止されたトランザクションを再開する前に、中止されたトランザクションを開始し、コミットすることになる。] [0074] 示されるように、時刻T1で、スレッド1は、そのトランザクションをコミットし、次いでトークン610は、スレッド2に進められる。しかし、スレッド2は、そのトランザクションをコミットすることができない。というのは、スレッド2は、同じトランザクション中にスレッド1によって格納された値をロードしたからである。すなわち、スレッド2は、スレッド1がAを格納する前に、Aをロードしたかもしれない。その結果、スレッド2は、そのトランザクションを中止し、再開しなければならない。示された例において、中止されたスレッド以降のスレッドIDを有するすべてのスレッドが中止される。一方、他の実施形態では、並行のトランザクションが同じ共有リソースにアクセスした以降のIDを有するスレッドのみが中止され、再開される。したがって、示された例では、スレッド3のトランザクションは、中止され、再開される。しかし、他の実施形態において、スレッド3のトランザクションは、中止されない。というのは、そのトランザクションは、並行のトランザクション中にスレッド2またはスレッド1によってアクセスされた共有リソースにアクセスしなかったからである。代わりに、スレッド3は、単にトークン610がそのスレッドIDに一致するのを待つことになる。スレッドIDがトークンに一致するスレッドが、その対応するトランザクションを正常にコミットするまで、トークン610は進められないことに留意されたい。] [0075] 示されるように、時刻T3で、スレッド2〜3は、その中止されたトランザクションを再開する。時刻T4で、トークン610の現在の値は、スレッド2のIDに一致するため、スレッド2は、その再開されたトランザクションが、それにトランザクションをコミットさせない競合をもたらしたかどうかを決定する。示された例において、スレッド2および3の再開されたトランザクションは、任意の共有メモリロケーションにアクセスしない。その結果、時刻T4で、スレッド2は、そのトランザクションを正常にコミットし、次いでトークン610は、スレッド3に進められる。時刻T5で、スレッド3は、そのトランザクションを正常にコミットし、次いでトークン610は、スレッド1に戻される。] [0076] 次に、時刻T6で、スレッド1〜3は、トランザクションを開始し、プロセスは上述したように続行する。時刻T6で、スレッド1および3の並行のトランザクションによって、スレッド3がそのトランザクションを中止し、再開することに留意されたい。しかし、スレッド1および2は、決定論的にコミットし、トークン610は、上述したように、スレッド3に進められる。] [0077] 図9は、1つまたは複数の実施形態において、マルチスレッドアプリケーションコードを増補するためにファシリティによって実行されるプロセス900を示すフロー図である。ステップ905〜940で、ファシリティは、マルチスレッドアプリケーションコード545の各関数をループする。ステップ905で、ファシリティは、関数を選択し、次いでステップ910に進む。ステップ910で、ファシリティは、DMP_Function_Start()関数515など、決定論的マルチプロセッシング起動関数を挿入し、次いでステップ915に進む。ステップ915で、ファシリティは、DMP_Init()関数520など、決定論的マルチプロセッシング初期化関数を挿入し、次いでステップ920に進む。ステップ920〜930で、ファシリティは、選択されたアプリケーションの各ブロックをループする。ステップ920で、ファシリティは、ブロックを選択し、次いでステップ925に進む。ステップ925で、ファシリティは、構文解析ブロック関数1000を呼び出し、次いでステップ930に進む。ステップ930で、追加のブロックが残っている場合、ファシリティはステップ920に進み、そうでない場合、ファシリティはステップ935に進む。ステップ935で、ファシリティは、DMP_Function_End()540など、決定論的プロセッシング終了関数を挿入し、次いでステップ940に進む。ステップ940で、追加の関数が残っている場合、ファシリティはステップ905に進み、そうでない場合、これらのステップは終了する。] 図9 [0078] 図10は、1つまたは複数の実施形態における、ブロックを構文解析するためにファシリティによって実行されるプロセス1000を示すフロー図である。ステップ1005で、ブロックがロードブロックであることをファシリティが決定した場合、ファシリティはステップ1010に進み、そうでない場合、ファシリティはステップ1015に進む。ステップ1010で、ファシリティは、ロードブロックの前にDMP_Load()関数530への呼び出しを挿入し、次いでファシリティは戻る。ステップ1015で、ブロックが格納ブロックであることをファシリティが決定した場合、ファシリティはステップ1020に進み、そうでない場合、ファシリティはステップ1025に進む。ステップ1020で、ファシリティは、格納ブロックの前にDMP_Store()関数525への呼び出しを挿入し、次いでファシリティは戻る。ステップ1025で、ブロックがジャンプブロックであることをファシリティが決定した場合、ファシリティはステップ1030に進み、そうでない場合、ファシリティはステップ1035に進む。ステップ1030で、ファシリティは、ジャンプの前にDMP_Commit()関数535への呼び出しを挿入し、ジャンプ先ポイントでDMP_Init()関数520への呼び出しを挿入し、次いでファシリティは戻る。ステップ1035で、ブロックが関数呼び出しであることをファシリティが決定した場合、ファシリティはステップ1040に進み、そうでない場合、ファシリティはステップ1045に進む。ステップ1040で、ファシリティは、呼び出し前にDMP_Commit()関数535への呼び出しを挿入し、呼び出し後DMP_Init()520への呼び出しを挿入し、次いでファシリティは戻る。ステップ1045で、ブロックがI/O呼び出しであることをファシリティが決定した場合、ファシリティは、上述したようにステップ1040に進み、そうでない場合、ファシリティはステップ1050に進む。ステップ1050で、ブロックが戻りブロックであることをファシリティが決定した場合、ファシリティはステップ1055に進み、そうでない場合、ファシリティは戻る。ステップ1055で、ファシリティは、戻りブロック前にDMP_Commit()535への呼び出しを挿入し、次いでファシリティは戻る。] 図10 [0079] 図11は、1つまたは複数の実施形態における、マルチスレッドアプリケーションの増補された関数の制御フローグラフ1100の一例である。「制御フローグラフ」という用語は、その実行中にアプリケーションによってトラバースされ得るすべてのパスの表現を指す。グラフ1100における各ノード1105〜1130は、基本ブロック、すなわち、任意のジャンプまたはジャンプターゲットのない直線のコードを表す。ジャンプターゲットは、ブロックを開始し、ジャンプは、ブロックを終了させる。例えば、DMP_Init()関数520を表すブロック1110は、ジャンプターゲットである。ブロック1105は、入口ブロックを表し、そこを通ってすべての制御がフローグラフに入る。ブロック1130は、出口ブロックを表し、そこを通ってすべての制御フローが出る。有向辺、例えば、ブロック1115と1125との間の辺、1120と1125との間の辺、およびブロック1110とブロック1115、1120、および1125との間の辺は、制御フローにおいてジャンプを表すために使用される。] 図11 [0080] 図12は、1つまたは複数の実施形態における、決定論的マルチプロセッシング(「DMP」)初期化関数1200を示すフロー図である。例えば、DMP初期化関数1200は、ファシリティがトランザクショナルメモリシステムと共に動作するとき、実行され得る。DMP初期化関数は、スレッドがトランザクションの処置を開始または続行できるように、スレッドが初期化された状態であるかどうかを決定するために実行され得る。スレッドが初期化されない(すなわち、スレッドのinitSite変数の値がゼロに等しい)場合、その実行は、トークンの値がスレッドIDに一致するまで一時停止される。スレッドが初期化された場合、スレッドは実行を続ける。] 図12 [0081] ステップ1205で、ファシリティは、スレッド開始変数(「initSite」)の値がゼロに等しいことを決定した場合、ファシリティはステップ1210に進み、そうでない場合、ファシリティは戻る。スレッドの初期化変数は、例えば、スレッドが正常にトランザクションをコミットした後、ゼロに割り当てることができる。ステップ1210で、トークンの現在の値がスレッドIDに一致することをファシリティが決定した場合、ファシリティはステップ1215に進み、そうでない場合、ファシリティは折り返してステップ1210に戻る。すなわち、ファシリティは、スレッドIDがトークンの値に一致するまで、ステップ1210におけるスレッド実行を一時停止する。ステップ1215で、ファシリティは、initSite変数を、スレッドがトランザクションを開始するメモリアドレスに割り当て、次いでファシリティは戻る。次いでinitSite変数は、トランザクションをコミットできない場合、明示的なジャンプアドレスとして使用され得る。] [0082] 図13は、1つまたは複数の実施形態における、決定論的マルチプロセッシング(「DMP」)コミット関数1300を示すフロー図である。例えば、DMPコミット関数1300は、ファシリティがトランザクショナルメモリシステムと共に動作するとき、実行され得る。ステップ1305で、ファシリティは、コミットブロック変数の値を減分し、次いでステップ1310に進む。コミットブロック変数は、スレッドによって実行された操作の数をカウントするために使用される。ステップ1310で、コミットブロック変数の値がゼロであることをファシリティが決定した場合、ファシリティはステップ1315に進み、そうでない場合、ファシリティは戻る。ステップ1315で、ファシリティが間に競合があったことを決定した(例えば、トランザクション中に別のスレッドによって書き込まれたロケーションからスレッドが読み取ったため)場合、ファシリティはステップ1320に進み、そうでない場合、ファシリティはステップ1325に進む。ステップ1320で、ファシリティはトランザクションを中止する。ステップ1325で、ファシリティは、トランザクションをコミットし、次いでステップ1330に進む。ステップ1330で、ファシリティは、スレッドのintiSite変数の値をゼロに割り当て、次いでステップ1335に進む。ステップ1335で、ファシリティは、コミットブロック変数の値をコミットブロックサイズに割り当てることによって、スレッドのコミットブロック変数の値をリセットし、次いで、ステップ1340に進む。ステップ1340で、ファシリティは、トークンの値を次のスレッドIDの値に割り当てることによって、トークンを進め、次いでファシリティは戻る。] 図13 [0083] このように、マルチスレッドアプリケーションの決定論的マルチプロセッシングのためのファシリティについて説明した。ファシリティについて、特定の実施形態を参照して説明してきたが、ファシリティは、記載した実施形態に限定されず、添付の特許請求の範囲の意図および範囲内の修正および変更で実施することができることを理解されたい。したがって、明細書および図面は、制限的意味ではなく、例示的意味でみなされるものとする。]
权利要求:
請求項1 マルチプロセッシングシステムにおけるマルチスレッドアプリケーションの決定論的実行(deterministic execution)を提供するために、前記マルチスレッドアプリケーションを増補(augmenting)するコンピューティングシステムにおける方法であって、2つ以上のスレッドの実行(execution)を指定するマルチスレッドアプリケーションコードにアクセスするステップと、前記マルチスレッドアプリケーションコードが実行されるとき、前記2つ以上のスレッドのうちの少なくとも1つの別のスレッドによってアクセス可能な状態(state)に影響を与える(affecting)ことができる操作(operations)を決定論的順序(deterministic order)でそれぞれ前記2つ以上のスレッドに実行させることができる前記マルチスレッドアプリケーションコードに同期コードを自動的に挿入するステップとを含む方法。 請求項2 前記決定論的順序が、前記2つ以上のスレッドが作成された順序である請求項1に記載の方法。 請求項3 前記決定論的順序がトークンの値に従って決定されており、前記2つ以上のスレッドの各スレッドについて、前記2つ以上のスレッドのうちの少なくとも1つによってアクセス可能な状態に影響を与えることができる操作を実行する前に、前記トークンの前記値を決定するために、前記同期コードを呼び出すステップと、前記トークンの前記決定された値が前記スレッドのスレッド識別子(identifier)に一致するとき、前記操作の実行を可能にするステップと、前記トークンの前記決定された値が前記スレッドのスレッド識別子に一致しないとき、前記スレッドの実行を一時停止(suspending)するステップとをさらに含む請求項1に記載の方法。 請求項4 前記挿入された同期コードが1つまたは複数のロック(locks)を含む請求項1に記載の方法。 請求項5 コンパイラによって実行される請求項1に記載の方法。 請求項6 マルチスレッドアプリケーションの決定論的実行を提供するために、トランザクショナルメモリシステムを増補するためのコンピューティングシステムにおける方法において、トランザクショナルメモリシステムのためのコードにアクセスするステップであって、前記コードがマルチスレッドアプリケーションのソースコードからコンパイルされたコードによって呼び出されるインターフェイスの1つまたは複数の実装(implementations)を含み、前記マルチスレッドアプリケーションソースコードが1つまたは複数のコードブロックをアトミックブロック(atomic blocks)と宣言し、前記マルチスレッドアプリケーションソースコードが2つ以上のスレッドを指定する、ステップと、前記マルチスレッドアプリケーションコードが実行されると、前記2つ以上のスレッドが決定論的順序でトランザクションをコミット(commit)するように、同期コードを含むために前記アクセスされたコードを増補(augmenting)するステップとを含む方法。 請求項7 前記マルチスレッドアプリケーションコードが実行されると、前記2つ以上のスレッドが前記決定論的順序でトランザクションを開始するように、同期コードを含むために前記アクセスされたコードを増補するステップをさらに含む請求項6に記載の方法。 請求項8 トランザクションが並行して実行される請求項6に記載の方法。 請求項9 前記決定論的順序が、前記2つ以上のスレッドが作成された順序である請求項6に記載の方法。 請求項10 前記決定論的順序がトークンを参照して(with reference to)決定され、前記2つ以上のスレッドのうちの1つについて、トランザクションをコミットする前に、前記トークンが前記スレッドのスレッド識別子に一致するかどうかを決定するために、前記同期コードを呼び出す(invoking)ステップと、前記トークンが前記スレッド識別子に一致するとき、前記トランザクションをコミットするステップと、前記トークンが前記スレッド識別子に一致しないとき、前記トランザクションを一時停止するステップと請求項6に記載の方法。 請求項11 区別されたトランザクションをコミットする前に、区別されたトランザクション中にスレッドによって実行される操作が別のスレッドによって実行される別の操作と競合(conflicts)するかどうかを決定するために、前記同期コードを呼び出すステップと、競合が存在するとき、前記区別されたトランザクションを中止するステップとをさらに含む請求項6に記載の方法。 請求項12 前記操作の結果、前記スレッドが前記別のスレッドによって影響される(affected)状態にアクセスするとき、競合が存在する請求項11に記載の方法。 請求項13 前記操作の結果、前記スレッドが前記別のスレッドによってアクセスされる状態に影響を与えるとき、競合が存在し、前記決定論的順序は、前記スレッドが前記区別された(distinguished)トランザクションをコミットする前に、トランザクションにコミットする機会(opportunity)が前記別のスレッドに提示されるようにする請求項11に記載の方法。 請求項14 前記区別されたトランザクションおよび前記別のトランザクションが中止される請求項13に記載の方法。 請求項15 前記区別されたトランザクションを再開する前に、前記別のトランザクションを再開(restarting)し、コミットするステップをさらに含む請求項14に記載の方法。 請求項16 トランザクショナルメモリシステムのコードであって、前記コードがトランザクションをコミットするための関数を指定(specifying)するインターフェイスを含む、コードと、トランザクションをコミットするための、前記トランザクショナルメモリシステムの前記インターフェイスの前記関数(function)を呼び出す(invoke)2つ以上のスレッドを指定するマルチスレッドアプリケーションコードと、トランザクションをコミットするための前記関数が呼び出されると、前記2つ以上のスレッドが決定論的順序でトランザクションをコミットするように、前記マルチスレッドアプリケーションコードに同期コードを挿入するための増補コンポーネントとを含むマルチプロセッシングシステム。 請求項17 前記マルチプロセッシングシステムが少なくとも1つのマルチコアプロセッサを含む請求項16に記載のマルチプロセッシングシステム。 請求項18 前記マルチプロセッシングシステムが少なくとも2つのプロセッサを含む請求項16に記載のマルチプロセッシングシステム。 請求項19 前記トランザクショナルメモリシステムがソフトウェアトランザクショナルメモリシステムである請求項16に記載のマルチプロセッシングシステム。 請求項20 前記トランザクションが並行して(concurrently)実行される請求項16に記載のマルチプロセッシングシステム。 請求項21 前記インターフェイスがトランザクションを開始するための関数をさらに指定し、トランザクションを開始するための前記関数が呼び出されると、前記2つ以上のスレッドが決定論的順序でトランザクションを開始するように、前記増補コンポーネントがコードを前記マルチスレッドアプリケーションコードに挿入(inserts)する請求項16に記載のマルチプロセッシングシステム。 請求項22 前記決定論的順序が、前記2つ以上のスレッドが作成された(created)順序である請求項16に記載のマルチプロセッシングシステム。 請求項23 トークンをさらに含み、前記トークンが前記2つ以上のスレッドのうちの1つに対応するスレッド識別子をその値として決定論的に指定し、前記トークンの前記値を調査(examining)することによって、前記決定論的順序が決定され、スレッド識別子が前記トークンの前記値に一致するスレッドによってトランザクションがコミットされると、前記トークンの前記値が前記2つ以上のスレッドのうちの1つの次のスレッド識別子を指定するために進められる請求項16に記載のマルチプロセッシングシステム。 請求項24 トランザクションをコミットする前に、前記スレッドのスレッド識別子の値が前記トークンの前記値に一致するかどうかを決定するために、前記同期コードがスレッドによって呼び出され、前記スレッド識別子が前記トークンの前記値に一致するとき、前記スレッドが前記トランザクションをコミットし、前記スレッド識別子が前記トークンの前記値に一致しないとき、前記トークンの前記値が前記スレッド識別子に一致するまで、前記スレッドが前記トランザクションをコミットするのを待つ請求項23に記載のマルチプロセッシングシステム。 請求項25 トランザクションをコミットする前に、区別されたスレッドによって実行された操作と、別のスレッドによって実行された操作との間に競合が存在するかどうかを決定するために、前記区別されたスレッドによって前記同期コードが呼び出され、競合が存在するとき、前記トランザクションを中止する請求項23に記載のマルチプロセッシングシステム。 請求項26 前記区別されたスレッドによって実行される前記操作の結果、前記区別されたスレッドが前記別のスレッドによって実行される前記操作によって影響される状態にアクセスしたとき、競合が存在する請求項25に記載のマルチプロセッシングシステム。 請求項27 前記区別されたスレッドの前記スレッド識別子を指定するために、前記トークンの前記値を進める前に、前記トークンが前記別のスレッドの前記スレッド識別子を決定論的に指定するとき、前記区別されたスレッドによって実行される前記操作の結果、前記区別されたスレッドが前記別のスレッドの前記操作によってアクセスされる状態に影響を与えるとき、競合が存在し、前記別のスレッドの前記スレッド識別子を指定するために、前記トークンの前記値を進める前に、前記トークンが前記区別されたスレッドの前記スレッド識別子を決定論的に指定するとき、前記区別されたスレッドによって実行される前記操作の結果、前記区別されたスレッドが前記別のスレッドの前記操作によって、状態アクセスに影響を与えるとき、競合が存在しない請求項25に記載のマルチプロセッシングシステム。 請求項28 前記マルチスレッドアプリケーションがマルチプロセッシングシステムにおいて実行されるとき、マルチスレッドアプリケーションのスレッドのグローバルなインターリービングを決定論的に制御するために使用可能なデータ構造を格納するコンピュータ可読記憶媒体において、前記データ構造が前記マルチスレッドアプリケーションの複数のスレッドのそれぞれについてスレッド識別子を格納するスレッドコンテナと、前記スレッドコンテナに格納されたスレッド識別子に対応する値を指定するトークン変数であって、前記トークン変数の前記値が、前記スレッド識別子が前記スレッドコンテナに格納されたシーケンスに従って決定論的に進む、トークン変数とを含むコンピュータ可読記憶媒体。 請求項29 前記スレッド識別子が、前記複数のスレッドが作成された順序で前記スレッドコンテナ内に格納される請求項28に記載のコンピュータ可読記憶媒体。 請求項30 前記スレッド識別子が、ユーザによって指定された順序で前記スレッドコンテナ内に格納される請求項28に記載のコンピュータ可読記憶媒体。 請求項31 前記データ構造が、所定の数の操作を指定するコミットブロックサイズをさらに含み、スレッド識別子が前記トークン変数の前記値に一致するスレッドが前記コミットブロックサイズによって指定される前記所定の数の操作を実行するとき、前記トークンの前記値が決定論的に進められる請求項28に記載のコンピュータ可読記憶媒体。 請求項32 別のスレッドによってアクセス可能な状態に影響を与えることができる操作のみが前記所定の数の操作に含まれる請求項31に記載のコンピュータ可読記憶媒体。 請求項33 前記コミットブロックサイズがユーザによって指定される請求項31に記載のコンピュータ可読記憶媒体。 請求項34 前記コンピュータ可読記憶媒体がトランザクショナルメモリシステムをさらに含み、スレッド識別子が前記トークン変数(variable)の前記値に一致するスレッドがトランザクションをコミットするとき、前記トークンが決定論的に進められる請求項28に記載のコンピュータ可読記憶媒体。 請求項35 前記トランザクショナルメモリシステムがソフトウェアトランザクショナルメモリシステムである請求項33に記載のコンピュータ可読記憶媒体。 請求項36 前記トランザクショナルメモリシステムがハードウェアトランザクショナルメモリシステムである請求項33に記載のコンピュータ可読記憶媒体。 請求項37 方法がメモリ操作の順序を制御するためのマルチプロセッシングシステムであり、前記方法がマルチプロセッシングシステムにおいてマルチスレッドアプリケーションコードを実行するステップであって、前記マルチスレッドアプリケーションコードが複数のスレッドを指定する、ステップと、前記マルチスレッドアプリケーションコードの前記実行を2つ以上の量子(quanta)に分割するステップであって、各量子がメモリ操作を含む決定論的数の操作を指定する、ステップと、前記複数のスレッドが前記2つ以上の量子を実行する決定論的順序を指定するステップとを含み、前記マルチスレッドアプリケーションコードが実行されるとき、メモリ操作を指定するスレッド間通信が決定論的である。 請求項38 前記複数のスレッドのうちの少なくとも1つのスレッドが前記複数のスレッドの別のスレッドによってプライベートに保持されるデータをロードするとき、前記スレッド間通信が行われる請求項37に記載の方法。 請求項39 スレッドが別のスレッドによってプライベートに保持されるデータをロードしようと試行するとき、前記複数のスレッドのそれぞれがその実行における決定論的ポイントに到達し、前記スレッドが実行を始めることを前記決定論的順序が指定するまで、前記スレッドの実行を一時停止するステップをさらに含む請求項38に記載の方法。 請求項40 スレッドが、量子の実行を終了するとき、その実行における決定論的ポイントに到達する請求項39に記載の方法。 請求項41 前記複数のスレッドのうちの1つのスレッドが前記1つのスレッドによってプライベートに保持されないデータを格納するとき、前記スレッド間通信が行われる請求項37に記載の方法。 請求項42 スレッドが前記スレッドによってプライベートに保持されないデータを格納しようと試行するとき、前記複数のスレッドのそれぞれがその実行における決定論的ポイントに到達し、前記スレッドが実行を始めることを前記決定論的順序が指定するまで、前記スレッドの実行を一時停止するステップをさらに含む請求項41に記載の方法。 請求項43 スレッドが、一時停止されたとき、その実行における決定論的ポイントに到達する請求項42に記載の方法。 請求項44 決定論的順序を指定するステップが、前記マルチスレッドアプリケーションコード内に同期コードを挿入するステップを含む請求項37に記載の方法。 請求項45 前記挿入された同期コードが1つまたは複数のロックを含む請求項44に記載の方法。 請求項46 前記挿入されたコードが前記スレッド間通信を監視(monitor)するために共有テーブルを実装する請求項44に記載の方法。 請求項47 前記マルチプロセッシングシステムがトランザクショナルメモリシステムを含み、同期コードを挿入するステップが各量子をトランザクション内に封入(encapsulating)するステップを含み、前記トランザクショナルメモリシステムが前記指定された決定論的順序で各トランザクションをコミットする請求項44に記載の方法。 請求項48 前記トランザクショナルメモリシステムが前記指定された決定論的順序で各トランザクションを開始する請求項47に記載の方法。 請求項49 前記トランザクションが並行して実行される請求項47に記載の方法。 請求項50 2つのトランザクション間の競合を検出するステップと、前記競合したトランザクションのうちの少なくとも一方を中止するステップと、前記指定された決定論的順序に従って前記少なくとも1つの中止されたトランザクションを再開するステップとをさらに含む請求項49に記載の方法。 請求項51 前記競合が前記トランザクショナルメモリシステムによって検出される請求項50に記載の方法。 請求項52 前記競合が、トランザクションによって指定されたメモリ操作ごとに、決定論的関数にコールバック(callback)するための前記トランザクショナルメモリシステムのインターフェイスを増補することによって検出される請求項50に記載の方法。 請求項53 前記トランザクショナルメモリシステムがソフトウェアトランザクショナルメモリシステムである請求項47に記載の方法。 請求項54 前記トランザクショナルメモリシステムがハイブリッドハードウェア−ソフトウェアトランザクショナルメモリシステムである請求項47に記載の方法。 請求項55 前記トランザクショナルメモリシステムがハードウェアトランザクショナルメモリシステムである請求項47に記載の方法。 請求項56 ハードウェアで排他的に(exclusively)実行される請求項37に記載の方法。 請求項57 前記マルチプロセッシングシステムが1つまたは複数のマルチコアプロセッサを含む請求項37に記載の方法。 請求項58 前記マルチスレッドアプリケーションコードの実行を選択的にシリアル化する請求項37に記載の方法。 請求項59 前記指定された決定論的数の操作がシステム操作をさらに含む請求項58に記載の方法。 請求項60 前記決定論的順序が、前記スレッドが作成された順序によって指定される請求項37に記載の方法。 請求項61 前記決定論的順序がユーザによって指定される請求項37に記載の方法。 請求項62 前記決定論的順序がトークンの値に従って指定されており、前記複数のスレッドごとに、メモリ操作を実行する前に、前記トークンの前記値を決定するステップと、前記トークンの前記決定された値が前記スレッドのスレッド識別子に一致するとき、前記複数のスレッドの1つおき(everyother)のスレッドがその実行における決定論的ポイントに到達すると、前記メモリ操作の実行を可能にするステップと、前記トークンの前記決定された値が前記スレッドの識別されたスレッドに一致しないとき、前記スレッドの実行を一時停止するステップとをさらに含む請求項37に記載の方法。 請求項63 マルチスレッドアプリケーションのスレッドのインターリービングを制御するためのマルチプロセッシングシステムであって、複数のスレッドを指定するマルチスレッドアプリケーションコードと、前記マルチスレッドアプリケーションコードを、決定論的数の操作をそれぞれ指定する2つ以上の量子に分割するための量子ビルダコンポーネントと、前記マルチスレッドアプリケーションのスレッドが前記2つ以上の量子を実行する決定論的順序を指定するための決定論的コンポーネントとを含み、前記マルチスレッドアプリケーションコードの複数の実行中に特定の入力が指定されたとき、各実行が前記特定の入力について同じ出力を生成するマルチプロセッシングシステム。 請求項64 前記マルチスレッドアプリケーションコードが前記マルチプロセッシングシステムにおいて実行され、前記マルチプロセッシングシステムが前記マルチスレッドアプリケーションコードのソフトウェア開発者によって操作される請求項63に記載のシステム。 請求項65 前記量子ビルダコンポーネントがハードウェアにおいて実装される請求項63に記載のシステム。 請求項66 前記決定論的コンポーネントがハードウェアにおいて実装される請求項63に記載のシステム。 請求項67 前記指定された決定論的数の操作内に、制御された操作として指定された特定の操作のみを含めることによって、前記量子ビルダコンポーネントが前記マルチスレッドアプリケーションコードの実行を選択的にシリアル化する請求項63に記載のシステム。 請求項68 制御された操作として指定される前記操作がシステム操作を含む請求項67に記載のシステム。 請求項69 制御された操作として指定される前記操作がメモリ操作を含む請求項67に記載のシステム。 請求項70 前記複数のスレッドのうちの1つのスレッドが、前記複数のスレッドのうちの別のスレッドの前記状態に影響を与えることができるメモリ操作を実行するとき、前記メモリ操作が前記決定論的コンポーネントによって指定された前記決定論的順序を侵害するかどうかを前記量子化ビルダコンポーネントが決定し、前記メモリ操作が前記決定論的順序を侵害するとき、前記複数のスレッドの各スレッドがその実行における決定論的ポイントに到達し、前記スレッドが続行することを前記決定論的コンポーネントが指定するまで、前記マルチプロセッシングシステムが前記メモリ操作の実行を一時停止し、前記メモリ操作が前記決定論的順序を侵害しないとき、前記マルチプロセッシングシステムが前記メモリ操作の実行を許可する請求項69に記載のシステム。 請求項71 前記スレッドが前記スレッドによってプライベートに保持されると見なされるデータをロードまたは格納することを前記メモリ操作が指定するとき、前記メモリ操作が前記決定論的順序を侵害しない請求項70に記載のシステム。 請求項72 前記スレッドが前記複数のスレッドによって共有されると見なされるデータをロードすることを前記メモリ操作が指定するとき、前記メモリ操作が前記決定論的順序を侵害しない請求項70に記載のシステム。 請求項73 前記スレッドが別のスレッドによってプライベートに保持されると見なされるデータをロードまたは格納することを前記メモリ操作が指定するとき、前記メモリ操作が前記決定論的順序を侵害する請求項70に記載のシステム。 請求項74 前記スレッドが前記複数のスレッドによって共有されると見なされるデータを格納することを前記メモリ操作が指定するとき、前記メモリ操作が前記決定論的順序を侵害した請求項70に記載のシステム。 請求項75 前記スレッドが前記複数のスレッドのうちの任意のものによってこれまでアクセスされていないデータをロードまたは格納することを前記メモリ操作が指定するとき、前記メモリ操作が前記決定論的順序を侵害する請求項70に記載のシステム。 請求項76 前記マルチプロセッシングシステムが各スレッドの実行を一時停止したとき、前記複数のスレッドの各スレッドがその実行における決定論的ポイントに到達する請求項70に記載のシステム。 請求項77 各スレッドが量子の実行を終了すると、前記複数のスレッドの各スレッドがその実行における決定論的ポイントに到達する請求項70に記載のシステム。 請求項78 同期コードを前記マルチスレッドアプリケーションコード内に挿入することによって、前記量子ビルダコンポーネントが前記マルチスレッドアプリケーションコードを2つ以上の量子に分割する請求項69に記載のシステム。 請求項79 前記挿入された同期コードが1つまたは複数のロックを含む請求項78に記載のシステム。 請求項80 前記挿入された同期コードがメモリ操作を追跡するための共有テーブルを含む請求項78に記載のシステム。 請求項81 トランザクショナルメモリシステムをさらに含み、前記挿入された同期コードが各量子をトランザクション内に封入し、各トランザクションが前記決定論的コンポーネントによって指定された前記決定論的順序でコミットされる請求項78に記載のシステム。 請求項82 前記トランザクションが並行して実行される請求項81に記載のシステム。 請求項83 2つ以上の並行して実行されるトランザクション間に競合が存在するとき、前記トランザクションのうちの少なくとも1つが、前記決定論的順序に従って中止され、再開される請求項82に記載のシステム。 請求項84 前記競合が前記トランザクショナルメモリシステムによって識別される請求項83に記載のシステム。 請求項85 前記競合が前記量子ビルダコンポーネントによって識別される請求項83に記載のシステム。 請求項86 前記含まれるトランザクショナルメモリシステムがハードウェアトランザクショナルメモリシステム、ソフトウェアトランザクショナルメモリシステム、ハイブリッドハードウェア−ソフトウェアトランザクショナルメモリシステム、およびトランザクショナルメモリシステムの組み合わせを含むグループから選択される請求項81に記載のシステム。 請求項87 前記決定論的順序が、前記複数のスレッドのそれぞれが作成された順序に基づいて指定される請求項69に記載のシステム。 請求項88 前記決定論的順序が、前記マルチスレッドアプリケーションコードのソフトウェア開発者によって前記決定論的コンポーネントに対して指定される請求項69に記載のシステム。 請求項89 前記決定論的コンポーネントが前記決定論的順序を指定するために使用されるトークンを実装する請求項69に記載のシステム。 請求項90 前記トークンが、前記複数のスレッドが実行する前記マルチプロセッシングシステムのプロセッサまたはコアの間の前記指定された決定論的順序で渡される請求項89に記載のシステム。 請求項91 前記トークンが前記複数のスレッドのそれぞれの間に前記指定された決定論的順序で渡される請求項89に記載のシステム。 請求項92 スレッドがメモリ操作を実行する前に、前記マルチプロセッシングシステムが前記トークンを前記スレッドの識別子と比較し、前記トークンが前記スレッドの前記識別子と一致するとき、前記複数のスレッドのそれぞれがその実行における決定論的ポイントに到達すると、前記メモリ操作の実行を可能にし、前記トークンが前記識別子に一致しないとき、前記トークンが前記スレッドの前記識別子に一致し、前記複数のスレッドのそれぞれがその実行における決定論的ポイントに到達するまで、前記スレッドの実行を一時停止する請求項89に記載のシステム。 請求項93 マルチプロセッシングシステムに、マルチスレッドアプリケーションのスレッドによって実行されるメモリ操作の順序を制御させることができるコードを格納するコンピュータ可読記憶媒体において、前記コードが、マルチスレッドアプリケーションコードを複数の量子に分割するためのコードであって、各量子が決定論的な有限数のメモリ操作を指定する、コードと、各量子を、前記マルチスレッドアプリケーションによって指定された2つ以上のスレッドのうちの1つによって決定論的にコミットされるトランザクション内に封入するためのコードとを含み、前記マルチプロセッシングシステムがトランザクショナルメモリシステムと共に動作するコンピュータ可読記憶媒体。 請求項94 前記トランザクショナルメモリシステムがハードウェアトランザクショナルメモリシステム、ソフトウェアトランザクショナルメモリシステム、ハイブリッドハードウェア−ソフトウェアトランザクショナルメモリシステム、およびトランザクショナルメモリシステムの組み合わせを含むグループから選択される請求項93に記載のコンピュータ可読記憶媒体。 請求項95 トランザクション内に封入される各量子が、前記2つ以上のスレッドが作成される順序に従って前記2つ以上のスレッドのうちの一方によって決定論的にコミットされる請求項93に記載のコンピュータ可読記憶媒体。 請求項96 トランザクションが並行して実行される請求項93に記載のコンピュータ可読記憶媒体。 請求項97 前記2つ以上のスレッドがトランザクションを決定論的にコミットする順序を指定するために使用されるトークンをさらに格納する請求項96に記載のコンピュータ可読記憶媒体。 請求項98 1つまたは複数の並行して実行されるトランザクション間の競合を識別するためのコードと、競合が識別されると、前記1つまたは複数の競合したトランザクションのうちの少なくとも1つを中止するためのコードと、前記トークンによって指定された前記順序に従って前記少なくとも1つの中止されたトランザクションを決定論的に再開するための命令とをさらに格納する請求項97に記載のコンピュータ可読記憶媒体。 請求項99 前記2つ以上のスレッドのうちの1つが前記2つ以上のスレッドのうちの別のスレッドによってプライベートに保持されると見なされるデータをロードまたは格納することを前記少なくとも1つのトランザクションのメモリ操作が指定するとき、競合が識別され、前記2つ以上のスレッドのうちの1つが前記2つ以上のスレッドによって共有と見なされるデータを格納することを前記少なくとも1つのトランザクションのメモリ操作が指定するとき、競合が識別され、前記2つ以上のスレッドのうちの1つが前記2つ以上のスレッドのうちの別のスレッドによってこれまでアクセスされていないデータをロードまたは格納することを前記少なくとも1つのトランザクションのメモリ操作が指定するとき、競合が識別される請求項98に記載のコンピュータ可読記憶媒体。 請求項100 前記2つ以上のスレッドのうちの1つが前記1つのスレッドによってプライベートに保持されると見なされるデータをロードまたは格納することを前記少なくとも1つのトランザクションのメモリ操作が指定するとき、競合が識別されず、前記2つ以上のスレッドのうちの1つが前記2つ以上のスレッドによって共有と見なされるデータをロードすることを前記少なくとも1つのトランザクションのメモリ操作が指定するとき、競合が識別されない請求項98に記載のコンピュータ可読記憶媒体。 請求項101 前記2つ以上のスレッドのうちの1つによってトランザクションがコミットされる前に、前記2つ以上のスレッドのそれぞれがその実行における決定論的ポイントに到達し、前記スレッドが前記トランザクションをコミットすることを前記トークンが指定するまで、前記1つのスレッドの実行を一時停止するためのコードをさらに格納する請求項97に記載のコンピュータ可読記憶媒体。 請求項102 各スレッドがトランザクションの実行を完了すると、各スレッドがその実行における決定論的ポイントに到達する請求項101に記載のコンピュータ可読記憶媒体。 請求項103 前記コードがランタイムシステムによって提供される請求項93に記載のコンピュータ可読記憶媒体。 請求項104 前記コードが前記マルチスレッドアプリケーションコードを増補するために使用される請求項93に記載のコンピュータ可読記憶媒体。 請求項105 前記マルチスレッドアプリケーションコードが、前記マルチスレッドアプリケーションコードのソフトウェア開発者によって指定された1つまたは複数のトランザクショナルメモリブロックを含み、前記コードが前記1つまたは複数のトランザクショナルメモリブロックを増補するためにさらに使用される請求項104に記載のコンピュータ可読記憶媒体。 請求項106 前記コードが前記トランザクショナルメモリシステムによって提供されるインターフェイスを増補するために使用される請求項93に記載のコンピュータ可読記憶媒体。
类似技术:
公开号 | 公开日 | 专利标题 Abdulla et al.2017|Stateless model checking for TSO and PSO US20170123862A1|2017-05-04|Concurrent Execution of Critical Sections by Eliding Ownership of Locks Gramoli2015|More than you ever wanted to know about synchronization: synchrobench, measuring the impact of the synchronization on concurrent algorithms JP2015111439A|2015-06-18|スレッドレベルの投機実行を拡張するためのプリミティブ Welc et al.2008|Irrevocable transactions and their applications Ŝevčik et al.2011|Relaxed-memory concurrency and verified compilation US9619281B2|2017-04-11|Systems and methods for adaptive integration of hardware and software lock elision techniques US9396115B2|2016-07-19|Rewind only transactions in a data processing system supporting transactional storage accesses Neamtiu et al.2009|Safe and timely updates to multi-threaded programs US8516202B2|2013-08-20|Hybrid transactional memory system | and method US5956507A|1999-09-21|Dynamic alteration of operating system kernel resource tables Harris et al.2010|Transactional memory US10282195B2|2019-05-07|Generating and applying patches to computer program code concurrently with its execution US7962923B2|2011-06-14|System and method for generating a lock-free dual queue Lu et al.2014|Efficient deterministic multithreading without global barriers US7395383B2|2008-07-01|Realtime-safe read copy update with per-processor read/write locks US9529645B2|2016-12-27|Methods and apparatus to manage speculative execution of object locks by diverting the speculative execution of target code Matveev et al.2015|Read-log-update: a lightweight synchronization mechanism for concurrent programming Tabba et al.2009|NZTM: Nonblocking zero-indirection transactional memory US9342454B2|2016-05-17|Nested rewind only and non rewind only transactions in a data processing system supporting transactional storage accesses US8495641B2|2013-07-23|Efficiently boosting priority of read-copy update readers while resolving races with exiting and unlocking processes US9195786B2|2015-11-24|Hardware simulation controller, system and method for functional verification Berger et al.2009|Grace: Safe multithreaded programming for C/C++ Batty et al.2015|The problem of programming language concurrency semantics Jula et al.2008|Deadlock immunity: Enabling systems to defend against deadlocks
同族专利:
公开号 | 公开日 JP5576798B2|2014-08-20| EP2232367A1|2010-09-29| US8694997B2|2014-04-08| WO2009076654A1|2009-06-18| EP2232367A4|2011-03-09| US20090165006A1|2009-06-25|
引用文献:
公开号 | 申请日 | 公开日 | 申请人 | 专利标题
法律状态:
2011-12-13| A621| Written request for application examination|Free format text: JAPANESE INTERMEDIATE CODE: A621 Effective date: 20111212 | 2012-12-07| A521| Written amendment|Free format text: JAPANESE INTERMEDIATE CODE: A523 Effective date: 20121206 | 2013-04-26| A977| Report on retrieval|Free format text: JAPANESE INTERMEDIATE CODE: A971007 Effective date: 20130426 | 2013-05-23| A131| Notification of reasons for refusal|Free format text: JAPANESE INTERMEDIATE CODE: A131 Effective date: 20130522 | 2013-08-23| A601| Written request for extension of time|Free format text: JAPANESE INTERMEDIATE CODE: A601 Effective date: 20130822 | 2013-08-30| A602| Written permission of extension of time|Free format text: JAPANESE INTERMEDIATE CODE: A602 Effective date: 20130829 | 2014-04-14| A131| Notification of reasons for refusal|Free format text: JAPANESE INTERMEDIATE CODE: A131 Effective date: 20140411 | 2014-05-15| A521| Written amendment|Free format text: JAPANESE INTERMEDIATE CODE: A523 Effective date: 20140514 | 2014-06-04| TRDD| Decision of grant or rejection written| 2014-06-09| A01| Written decision to grant a patent or to grant a registration (utility model)|Free format text: JAPANESE INTERMEDIATE CODE: A01 Effective date: 20140606 | 2014-07-10| A61| First payment of annual fees (during grant procedure)|Free format text: JAPANESE INTERMEDIATE CODE: A61 Effective date: 20140704 | 2014-07-11| R150| Certificate of patent or registration of utility model|Ref document number: 5576798 Country of ref document: JP Free format text: JAPANESE INTERMEDIATE CODE: R150 | 2017-07-11| LAPS| Cancellation because of no payment of annual fees|
优先权:
[返回顶部]
申请号 | 申请日 | 专利标题 相关专利
Sulfonates, polymers, resist compositions and patterning process
Washing machine
Washing machine
Device for fixture finishing and tension adjusting of membrane
Structure for Equipping Band in a Plane Cathode Ray Tube
Process for preparation of 7 alpha-carboxyl 9, 11-epoxy steroids and intermediates useful therein an
国家/地区
|